我有一个类有 2 套 getter 和 setter。 1套为传统型。这些按预期工作:
var userEmail : String
{
get {
return UserDefaults.standard.string(forKey: UserDefaultKeys.profileEmail) ?? ""
}
set (newValue) {
UserDefaults.standard.set(newValue, forKey: UserDefaultKeys.profileEmail)
UserDefaults.standard.synchronize()
}
}
var podSerialNum : Int
{
get {
return UserDefaults.standard.integer(forKey: UserDefaultKeys.profilePodSN)
}
set (newValue) {
UserDefaults.standard.set(newValue, forKey: UserDefaultKeys.profilePodSN)
UserDefaults.standard.synchronize()
}
}
var podID : Int
{
get {
return UserDefaults.standard.integer(forKey: UserDefaultKeys.profilePodID)
}
set (newValue) {
UserDefaults.standard.set(newValue, forKey: UserDefaultKeys.profilePodID)
UserDefaults.standard.synchronize()
}
}
另一个一次获取/设置所有属性。
var userProfile: (email:String?, podSn:String?, podId:String?)
{
get {
return ( UserDefaults.standard.value(forKey: UserDefaultKeys.profileEmail) as? String,
UserDefaults.standard.value(forKey: UserDefaultKeys.profilePodSN) as? String,
UserDefaults.standard.value(forKey: UserDefaultKeys.profilePodID) as? String)
}
set {
UserDefaults.standard.set(newValue.email, forKey: UserDefaultKeys.profileEmail)
UserDefaults.standard.set(newValue.podSn, forKey: UserDefaultKeys.profilePodSN)
UserDefaults.standard.set(newValue.podId, forKey: UserDefaultKeys.profilePodID)
UserDefaults.standard.synchronize()
}
}
userProfile.podSn
总是返回 nil。然而 userProfile.email
& userProfile.podId
按预期工作。此外,直接 getter (podSerialNum
) 也有效。
我错过了什么?
最佳答案
添加几个步骤来理解:
UserDefaults.standard.value(forKey: UserDefaultKeys.profilePodSN) as? String
=>
let podSNFromUserDefaults = UserDefaults.standard.value(forKey: UserDefaultKeys.profilePodSN)
let podSNAsString = podSNFromUserDefaults as? String
好吧,您会看到 podSNFromUserDefaults
不是 nil
,它是 podSNAsString
。
为什么 ?因为 podSNFromUserDefaults
是一个 Int
/NSNumber
,而不是一个 String
。您不能像那样将其转换为 String
。使用 String(myInt)
。
因为我们已经知道它是一个 Int,就像您对每个调用所做的那样,使用 integer(forKey:)
,并直接使用 string(forKey:)
也用于profileEmail
,您不需要 as 吗? String
之后。
var userProfile: (email: String?, podSn: String?, podId: String?)
{
get {
return (UserDefaults.standard.string(forKey: UserDefaultKeys.profileEmail),
String(UserDefaults.standard.integer(forKey: UserDefaultKeys.profilePodSN)),
String(UserDefaults.standard.integer(forKey: UserDefaultKeys.profilePodID))
}
}
旁注:
您应该去掉 UserDefaults.standard.synchronize()
。
提示:
如果您遇到问题,请不要忘记将一行中的多个调用分成多个调用。然后应该更容易调试哪个步骤完全不起作用。
关于swift - 为什么这些 getter/setter 中的 1 个起作用而其他的不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55300399/