我有一堂课,有2套getter和setters。 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
可以正常工作。另外,直接获取器(podSerialNum
)也可以工作。
我想念什么?
答案 0 :(得分:1)
添加一些了解步骤:
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
,因此您不需要{之后{1}}。
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))
}
}
。
提示:
如果遇到问题,请不要忘记将一行中的多个呼叫分解为多个呼叫。然后应该更容易调试出哪一步完全不起作用。