如果通过覆盖 getter 不存在,则从 NSUserDefaults 加载存档值

Load archived value from NSUserDefaults if it doesn't exist by overriding getter

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

我的 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")
    }
}

您的代码发生了什么,是在 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")
    }
}