为什么其中1个getter / setter工作而其他人没有

问题描述 投票:0回答:1

我有一个有2套吸气剂和固定剂的类。 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总是返回零。然而userProfile.emailuserProfile.podId按预期工作。此外,直接吸气剂(podSerialNum)工作。

我错过了什么?

swift getter-setter
1个回答
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,之后你不需要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()

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

© www.soinside.com 2019 - 2024. All rights reserved.