swift - 为什么这些 getter/setter 中的 1 个起作用而其他的不起作用

标签 swift getter-setter

我有一个类有 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/

相关文章:

swift - 无需强制转换即可访问 UIViewController 类属性?

C++ : generic getter/setter for each single member of private struct

python - 覆盖多维数组的 setter

java - 如何在用户每次输入字符串值时自动生成整数值?

java - 如何忽略从java中的lombok生成一个字段

python - 我应该使用属性还是 getter 和 setter?

Swift - 基于计数器打印和重复消息的程序

ios - 截图时没有相机 View ,只有白色背景

swift - Swift Core Data 中的一对多关系

swift - 在 Cloudkit 谓词上使用 OR 运算符