0

プロパティが設定されていない場合に、アーカイブされたクラスのコピーをロードするフォールバック関数を追加しようとしています。

セッターが値を保存するように正常に動作しています (そしてすべての 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.currentUser内部self.currentUserのゲッターを呼び出しています。計算されたプロパティにカスタム getter を指定すると、実際にはそのインスタンスのストレージがありません。つまり、値は保存されず、常に計算されます。必要なのは_currentUser、値を実際に保存する場所と、カスタムゲッターでチェックインする、プライベートにすることができる別のインスタンスプロパティです。


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 に答える