0

如果未设置属性,我正在尝试添加一个后备函数来加载类的存档副本。

我已经让 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")
    }
}
4

1 回答 1

2

您的代码发生了什么,正在调用self.currentUserinsideself.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")
    }
}
于 2016-01-22T09:01:16.427 回答