我正在开发一个快速的项目,我有几个数组。在我的一个数组中,我不希望客户端能够在不使用我特别定义的方法的情况下改变它。另一方面,我希望可以访问getter。我的问题出现在追加和设置属性上。
问题1 :private(set)
是否阻止客户致电array.append
?
在另一个数组上,我想看看它是否已被更改。
问题2 :如果我使用didSet
将属性观察者添加到数组中,那么当元素附加到数组时调用didSet
?
答案 0 :(得分:32)
问题1:私有(设置)是否阻止客户端调用array.append?
是的。
问题2:如果我使用didSet
将一个属性观察者添加到数组中,那么在将一个元素附加到数组时会调用它吗?
是的,didSet
在调用append()
时被调用。
答案 1 :(得分:4)
当您意识到Swift中的数组通过值有效传递时,您的问题的答案很容易理解。我有效地说,因为他们表现就好像它们被传递时一样被复制,但是有一些聪明的魔法来优化事物并避免实际上不必要地复制元素。
当属性值改变时调用didSet
处理程序,在Swift中包含数组。因此append()
在Swift中的数组实际上类似于整数上的+=
:首先读取数组,然后使用附加值创建一个新数组,然后写入新数组回到酒店。因此,如果您在数组属性上调用didSet
,则可以看到它肯定会调用append()
,同样,通过使set
为私有,外部用户也无法调用{ {1}}因为他们无法将新值写回数组。
答案 2 :(得分:2)
这里没有任何特定的数组,这是数组结构和append
是变异成员的结果。调用append
非常类似于影响属性的新值。这不是超级明确的,但是mutating members和stored properties的文档中有更多信息可以备份语言正确处理变异的事实。