2017-08-24 11 views
0

その他の質問は変数の前にlazyを使用することを指摘していますが、この場合は動作しません。プロパティ初期化子内でインスタンスメンバーを使用できません。変数をlazyに設定すると動作しません。

私はまだ

はプロパティ初期化子内のインスタンスメンバ「デフォルト」を使用することはできません、このエラーを取得します。 'self'が利用可能になる前にプロパティイニシャライザが実行されます

どこが間違っていますか?

class UserData{ 

    let defaults  = UserDefaults.standard 
    lazy var userDataDict = defaults.object(forKey: "UserDataDict") as? [String: String] ?? [String: String]() 


    static func setMobileNumber(mobileNumber: String){ 

     userDataDict["mobileNumber"]   = mobileNumber 

    } 
} 
+1

あなたはスウィフト3内の明示的な型注釈が必要になります。https://stackoverflow.com/questions/38118429/swift-lazy-instantiating自己を使ってこれはSwift 4で修正されました。 –

+1

静的なsetMobileNumberメソッドでインスタンスプロパティを設定することはできません。 –

答えて

0

この構文試してみてください:

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() 
    } 
} 
関連する問題