1

我想在设置值时直接与 UserDefaults 保持变量同步。我已经这样做了:

var userId: String {
    get {
        return UserDefaults.standard.string(forKey: kUserIdKey) ?? ""
    }
    set {
        UserDefaults.standard.set(newValue, forKey: kUserIdKey)
    }
}

它工作正常,但它是正确的方法吗?

如果是这样,那么数组呢?

var tagsList: [Int] {
    get {
        return (UserDefaults.standard.object(forKey: kTagsList) as? [Int]) ?? [Int]()
    }
    set {
        UserDefaults.standard.set(newValue, forKey: kTagsList)
    }
}

如果我添加一个元素tagsList.append(0),新值是否存储在 UserDefaults 中?

更新

这是我在操场上的东西: 在此处输入图像描述

4

2 回答 2

2

简短的回答:是的。

长答案:数组和字符串struct在 Swift 中是 s,当发生突变时,它们在语义上会生成一个全新的副本。

因此newValue,setter 中的 是您应用于数组的任何突变的结果数组,无论它是一个append或其他突变函数。

您可以在 Playground 中轻松验证此行为,如下所示:

var array: [Int] {
    get { return [1, 2, 3] }
    set { print(newValue) }
}

array.append(4)
// Prints [1, 2, 3, 4]
于 2017-10-18T08:05:17.233 回答
2

如果我添加一个元素 tagsList.append(0),新值是否存储在 UserDefaults 中?

是的。

乍一看,你有一个 setter,作为一个 setter,它只在你进行新赋值时观察值,例如:

tagsList = [1,2,3]// 新值。

如果Array<Int>( [Int]) 是类,我们可以说,即使您确实通过调用 修改了现有数组append,这本身也不是一个赋值。但是,[Int]is 不是 a class,它是 a struct,这意味着任何修改(mutates,正确)existing 的函数struct基本上都会导致新的分配。这就是为什么你会看到 setter 被触发的原因。

于 2017-10-18T08:13:27.927 回答