在Swift Array上使用didSet和private(set)

时间:2015-07-02 16:07:47

标签: arrays swift append didset

我正在开发一个快速的项目,我有几个数组。在我的一个数组中,我不希望客户端能够在不使用我特别定义的方法的情况下改变它。另一方面,我希望可以访问getter。我的问题出现在追加和设置属性上。

问题1 private(set)是否阻止客户致电array.append

在另一个数组上,我想看看它是否已被更改。

问题2 :如果我使用didSet将属性观察者添加到数组中,那么当元素附加到数组时调用didSet

3 个答案:

答案 0 :(得分:32)

问题1:私有(设置)是否阻止客户端调用array.append?

是的。

问题2:如果我使用didSet将一个属性观察者添加到数组中,那么在将一个元素附加到数组时会调用它吗?

是的,didSet在调用append()时被调用。

答案 1 :(得分:4)

当您意识到Swift中的数组通过值有效传递时,您的问题的答案很容易理解。我有效地说,因为他们表现就好像它们被传递时一样被复制,但是有一些聪明的魔法来优化事物并避免实际上不必要地复制元素。

当属性值改变时调用didSet处理程序,在Swift中包含数组。因此append()在Swift中的数组实际上类似于整数上的+=:首先读取数组,然后使用附加值创建一个新数组,然后写入新数组回到酒店。因此,如果您在数组属性上调用didSet,则可以看到它肯定会调用append(),同样,通过使set为私有,外部用户也无法调用{ {1}}因为他们无法将新值写回数组。

答案 2 :(得分:2)

  1. 问题1 是的,因为变异函数调用会更改存储的值,因此private(set)会禁止调用变异函数。
  2. 问题2 是的,出于同样的原因,会触发观察员。
  3. 这里没有任何特定的数组,这是数组结构和append是变异成员的结果。调用append非常类似于影响属性的新值。这不是超级明确的,但是mutating membersstored properties的文档中有更多信息可以备份语言正确处理变异的事实。