无法在属性初始值设定项中使用实例成员,将变量设置为懒惰不起作用
问题描述:
其他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
}
}
答
试试这个语法:
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()
}
}
你需要斯威夫特3显式类型注解:https://*.com/questions/38118429/swift-lazy-instantiating - 使用自我。这已在Swift 4中修复。 –
您无法在静态setMobileNumber方法中设置实例属性。 –