假设我的类练习集有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
的结构,它工作了,调用了didSet
set。因为当structure的属性值发生变化时,基本上意味着创建新的structure,除了被复制的字段之外,其他字段都被复制。