2016-01-22 36 views
0

我想添加一个回退函数加载类的存档副本如果属性未设置。从NSUserDefaults加载归档值,如果它不存在通过覆盖getter

我已经得到了setter工作正常,所以它存储的价值(和所有的NSCoding工作正常),但如果我试图引用这个地方,而不是使用实际的变量属性,它总是从NSUserDefaults加载。

这里是我到目前为止有:

public var currentUser: User? { 
    get { 
     var user = self.currentUser 
     //^this totally blows it up 
     if (user == nil) { 
      user = User.init(name: "") as? User 
      if let data = NSUserDefaults.standardUserDefaults().objectForKey("currentUser") as? NSData { 
       let unarc = NSKeyedUnarchiver(forReadingWithData: data) 
       user = unarc.decodeObjectForKey("root") as? User 
      } 
     } 
     return user 
    } 
    set(value) { 
     self.currentUser = value 
     NSUserDefaults.standardUserDefaults().setObject(NSKeyedArchiver.archivedDataWithRootObject(value!), forKey: "currentUser") 
    } 
} 
+0

您需要显示用户类声明 –

+0

为什么?它有几个基本属性和一个init方法。我可以添加它,但我现在在移动设备上,无法访问。 – brandonscript

+0

因为它需要NSCoding兼容,你需要将它保存为NSData –

回答

2

什么是你的代码发生,呼吁self.currentUserself.currentUser的getter中。当您为计算属性指定自定义getter时,实际上并没有存储该实例的存储空间,即该值未保存,而是始终计算。 你需要的是另一个实例属性,它可以是私有的,比如_currentUser,你实际保存的值以及你在自定义getter中检查的属性。


private var _currentUser: User? 
public var currentUser: User? { 
    get { 
     if (_currentUser == nil) { 
      _currentUser = User.init(name: "") as? User 
      if let data = NSUserDefaults.standardUserDefaults().objectForKey("currentUser") as? NSData { 
       let unarc = NSKeyedUnarchiver(forReadingWithData: data) 
       _currentUser = unarc.decodeObjectForKey("root") as? User 
      } 
     } 
     return _currentUser 
    } 
    set(value) { 
     _currentUser = value 
     NSUserDefaults.standardUserDefaults().setObject(NSKeyedArchiver.archivedDataWithRootObject(value!), forKey: "currentUser") 
    } 
}