无法在 属性 初始值设定项中使用实例成员,将变量设置为惰性不起作用
Cannot use instance member within property initializer, setting the variable to lazy doesn't work
其他 SO 问题指出在变量之前使用 lazy,但这在这种情况下似乎不起作用。
我仍然遇到这个错误,
Cannot use instance member 'defaults' within property initializer;
property initializers run before 'self' is available
我哪里弄错了?
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
一次(第一次访问),你不会看到任何changes/updates完成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
}
作为最后一个标记,就用户默认数据库而言,所有这些都是您的字典 "read only";如果您希望保留任何更改,您的 属性 也需要 setter:
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()
}
}
其他 SO 问题指出在变量之前使用 lazy,但这在这种情况下似乎不起作用。
我仍然遇到这个错误,
Cannot use instance member 'defaults' within property initializer; property initializers run before 'self' is available
我哪里弄错了?
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
一次(第一次访问),你不会看到任何changes/updates完成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
}
作为最后一个标记,就用户默认数据库而言,所有这些都是您的字典 "read only";如果您希望保留任何更改,您的 属性 也需要 setter:
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()
}
}