为什么其中有一个吸气器/设置器起作用,而其他吸气器/设置器却不起作用

时间:2019-03-22 13:12:47

标签: swift getter-setter

我有一堂课,有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.emailuserProfile.podId可以正常工作。另外,直接获取器(podSerialNum)也可以工作。

我想念什么?

1 个答案:

答案 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。 为什么呢因为podSNFromUserDefaultsInt / 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)) } }

提示:
如果遇到问题,请不要忘记将一行中的多个呼叫分解为多个呼叫。然后应该更容易调试出哪一步完全不起作用。