2017-08-24 19 views
0

其他SO问题指出在变量之前使用lazy,但在这种情况下似乎不起作用。无法在属性初始值设定项中使用实例成员,将变量设置为懒惰不起作用

我仍然得到这个错误,

不能使用属性初始化中的实例成员“默认”; 属性初始值设定项在“自我”可用之前运行

我在哪里弄错了?

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(被访问的第一次),你不会看到任何变化/更新做UserDefaults.standard之后。

我建议你使用一个计算性能代替:

var userDataDict: [String : String] { 
    guard let dict = defaults.object(forKey: "UserDataDict") as? [String: String] ?? [String: String]() else { 
     return [:] 
    } 
    return dict 
} 

(它是没有这样一个代价高昂的操作做懒洋洋地只有一次,反正)

另外,我不明白将UserDefaults.standard的副本作为对象的属性;也许这只是最好有:

// 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 
} 

作为最后temark,所有这些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() 
    } 
} 
相关问题