如果未设置该属性,我正在尝试添加一个回退函数来加载类的存档副本。
我已经让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 :(得分:2)
您的代码发生了什么,在self.currentUser
的getter中调用self.currentUser
。为计算属性指定自定义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")
}
}