假设我的类练习集有3个属性:id、name、isEnabled。
我有一组此类对象:

var exerciseSets: [ExerciseSet] = [] {
    didSet {
        ExerciseSet.syncWithPList(updatedSets: exerciseSets)
    }
}

在代码中的某个地方,我执行以下操作:
exerciseSets[index].isEnabled = !exerciseSets[index].isEnabled

但在这种情况下,迪德塞特不会开枪。只有我这样写:
let set = exerciseSets[index]
set.isEnabled = !set.isEnabled
exerciseSets[index] = set

为什么会这样?我能用前一种方法吗?后者似乎冗长,我讨厌它。

最佳答案

为什么会这样?
didSet在更改属性值时触发,例如,当数组本身更改时。
在这里

exerciseSets[index].isEnabled = !exerciseSets[index].isEnabled

更改数组中某个对象的属性,但数组保持不变,并且包含相同的对象。所以didSet不会被调用。
我能用前一种方法吗?
不,你不能。用后者。
编辑:我检查了@martin-r advice以使用ExerciseSet的结构,它工作了,调用了didSetset。因为当structure的属性值发生变化时,基本上意味着创建新的structure,除了被复制的字段之外,其他字段都被复制。

10-06 00:56