この構文試してみてください:
lazy var userDataDict: [String : String] = {
defaults.object(forKey: "UserDataDict") as? [String: String] ?? [String: String]()
}()
しかし、これは一度だけuserDataDict
を設定します(それがアクセスされた1回目)、そしてあなたは、任意の変更/更新がUserDefaults.standard
に行って見ることはありませんその後。
私はあなたの代わりに計算プロパティを使用することをお勧め:
var userDataDict: [String : String] {
guard let dict = defaults.object(forKey: "UserDataDict") as? [String: String] ?? [String: String]() else {
return [:]
}
return dict
}
(とにかく、一度だけ遅延して行うには、このような高価な操作ではありません)
また、私は表示されませんあなたのオブジェクトのプロパティとしてUserDefaults.standard
のコピーを持つ点。おそらくそれは、持っているだけでベストです:最後temarkとして
// remove:
// let defaults = UserDefaults.standard
var userDataDict: [String : String] {
guard let dict = UserDefaults.standard.object(forKey: "UserDataDict") as? [String: String] ?? [String: String]() else {
return [:]
}
return dict
}
を、これらすべてのamkesがあなたの辞書限りユーザデフォルトデータベースに関しては、「読み取り専用します」。あなたはすべての変更を保存したい場合は、あなたの財産は、あまりにもセッターを必要とします:
var userDataDict: [String : String] {
get {
guard let dict = UserDefaults.standard.object(forKey: "UserDataDict") as? [String: String] ?? [String: String]() else {
return [:]
}
return dict
}
set (newValue) {
UserDefaults.standard.set(newValue, forKey: "UserDataDict")
UserDefaults.standard.synchronize()
}
}
あなたはスウィフト3内の明示的な型注釈が必要になります。https://stackoverflow.com/questions/38118429/swift-lazy-instantiating自己を使ってこれはSwift 4で修正されました。 –
静的なsetMobileNumberメソッドでインスタンスプロパティを設定することはできません。 –