首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Swift didSet不开火

Swift didSet不开火
EN

Stack Overflow用户
提问于 2016-11-16 07:45:23
回答 4查看 727关注 0票数 0

假设我有类ExerciseSet,它有3个属性: id、name、isEnabled。

我有一个这个类的对象数组:

代码语言:javascript
复制
var exerciseSets: [ExerciseSet] = [] {
    didSet {
        ExerciseSet.syncWithPList(updatedSets: exerciseSets)
    }
}

在代码的某个地方,我执行以下操作:

代码语言:javascript
复制
exerciseSets[index].isEnabled = !exerciseSets[index].isEnabled

但在这种情况下,didSet不会开火。除非我这样写:

代码语言:javascript
复制
let set = exerciseSets[index]
set.isEnabled = !set.isEnabled
exerciseSets[index] = set

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-11-16 08:04:46

为什么会这样呢?

didSet是在更改属性的值时触发的,例如,当数组本身更改时就是如此。

这里

代码语言:javascript
复制
exerciseSets[index].isEnabled = !exerciseSets[index].isEnabled

更改数组中某些对象的属性,但是数组保持相同的,并且包含相同的对象。所以不会叫didSet

我可以用前一种方法吗?

不,你不能用后一种。

编辑:我检查了@martin-r建议,以便为ExerciseSet使用structs,并且它可以工作,didSet集被调用。因为,当结构的属性值发生变化时,基本上意味着创建新的结构,只需复制已更改的字段。

票数 0
EN

Stack Overflow用户

发布于 2016-11-16 08:04:12

这很可能是因为ExerciseSet是一个类,这意味着它是一个引用类型。

只需将引用类型变量想象为存储数字。然后,这些数字指向实际的ExerciseSet在内存中的位置。换句话说,[ExerciseSet]本质上是一个数字数组。

当你这样做时:

代码语言:javascript
复制
exerciseSets[index].isEnabled = !exerciseSets[index].isEnabled

您没有更改数组中的任何“数字”。您只在特定索引处查找"number“,然后使用该"number”查找ExerciseSet对象。之后,您将设置ExerciseSet的一个属性。

正如您所看到的,您根本没有修改数组中的“数字”!

另一方面,第二段代码调用didSet,因为您告诉它在特定索引处丢弃元素,并在索引处放置指向set的“数字”。由于您正在抛出数组的一个元素并将其放回其中,所以您要更改数组本身!因此,调用didSet

票数 2
EN

Stack Overflow用户

发布于 2016-11-16 08:04:05

仇恨是一个强有力的词:)

在这一行:

代码语言:javascript
复制
exerciseSets[index].isEnabled = !exerciseSets[index].isEnabled

实际上,您并不是在直接更改exerciseSets数组中的任何内容,而是在更改该数组中特定ExerciseSet项上的某些内容。

将其与以下情况进行比较:

代码语言:javascript
复制
let set = exerciseSets[index]
set.isEnabled = !set.isEnabled
exerciseSets[index] = set

在这里,您正在更改exerciseSets数组中的实际项,因此会触发didSet

你能做点什么吗?好问题:)您需要以某种方式更新exerciseSets数组,以强制使用didSet,所以我认为您不能比上面的三行短得多。不过,我希望我错了。

是的,与其说是回答,不如说是评论,希望你能用它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40626567

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档