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

rao*_*oul 24 arrays append swift didset

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

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

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

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

tre*_*orj 34

问题1: private(set)是否阻止客户端调用array.append?

是的,它确实.

问题2:如果我使用属性观察器添加到数组中didSet,那么当元素附加到数组时是否会调用它?

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

  • @ onmyway133我没想问答案是否已经过测试.我明白我可以自己测试一下.我问的是文档是否在任何地方都提到了答案.如果正式提到,添加该文档的链接可能对将来想要了解其工作原理的详细信息的读者有所帮助. (11认同)

dev*_*os1 5

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

didSet属性值时的变化,其在夫特包括阵列处理器被调用。所以append()Swift 中的数组实际上类似于+=整数上的a :首先读取数组,然后使用附加值创建一个新数组,然后将该新数组写回属性。因此,您可以看到,didSet如果您调用append()数组属性,它肯定会调用,同样,通过set设为私有,外部用户将无法调用,append()因为他们无法将新值写回数组。