クラス変数(この場合はid
とauthToken
の変数にセッターを追加してNSUserDefaultsに保存しようとすると、値が保存されないように見えます。 id
とauthToken
のゲッターは常に偶数値でそれらを設定した後nilを返し、上のブレークポイント。NSUserDefaultsがクラス変数のセッターに保存されない
class CurrentUser {
static let defaultInstance = CurrentUser()
func updateUser(id id: String, authToken: String) {
self.id = id
self.authToken = authToken
}
var authToken: String? {
get {
if let authToken = NSUserDefaults.standardUserDefaults().objectForKey("userAuthToken") {
return (authToken as! String)
} else {
return nil
}
}
set {
NSUserDefaults.standardUserDefaults().setObject(authToken, forKey: "userAuthToken")
NSUserDefaults.standardUserDefaults().synchronize()
}
}
var id: String? {
get {
if let id = NSUserDefaults.standardUserDefaults().objectForKey("userId") {
return (id as! String)
} else {
return nil
}
}
set {
NSUserDefaults.standardUserDefaults().setObject(id, forKey: "userId")
NSUserDefaults.standardUserDefaults().synchronize()
}
}
}
しかし、私が期待されるすべての著作物として、updateUser機能(1つの高いレベル)に出ラインを引きます。
class CurrentUser {
static let defaultInstance = CurrentUser()
func updateUser(id id: String, authToken: String) {
NSUserDefaults.standardUserDefaults().setObject(id, forKey: "userId")
NSUserDefaults.standardUserDefaults().synchronize()
NSUserDefaults.standardUserDefaults().setObject(authToken, forKey: "userAuthToken")
NSUserDefaults.standardUserDefaults().synchronize()
}
var authToken: String? {
get {
if let authToken = NSUserDefaults.standardUserDefaults().objectForKey("userAuthToken") {
return (authToken as! String)
} else {
return nil
}
}
}
var id: String? {
get {
if let id = NSUserDefaults.standardUserDefaults().objectForKey("userId") {
return (id as! String)
} else {
return nil
}
}
}
}
これはなぜでしょうか?私は何が欠けていますか? {set}はNSUserDefaultsにアクセスできない別のスレッド/モードで動作しますか?
オブジェクトの存続期間中にロード/保存して単純なインスタンス変数として保存しないのはなぜですか?それは過度に設計されています。 – Droppy
@Droppyあなたはそのことをもう少し説明できますか? – Alex
dealloc(またはswiftで呼び出されたもの)中にinitの間に値をロードして保存し、その値を通常のインスタンス変数として保持します。代わりに明示的なロード/セーブメソッドを持つこともできます。変更するたびにユーザーデフォルトに同期する必要があるとは思っていません。 – Droppy