Arrays 在Swift数组上使用didSet和private(set)

Arrays 在Swift数组上使用didSet和private(set),arrays,swift,append,didset,Arrays,Swift,Append,Didset,我正在做一个swift项目,我有几个阵列。在我的一个数组中,我不希望客户机能够在不使用我特别定义的方法的情况下对其进行变异。另一方面,我希望getter可以访问。我的问题是关于附加和设置属性的 问题1:私有(设置)是否阻止客户端调用数组。追加 在另一个阵列上,我想看看它是否已更改 问题2:如果我使用didSet将属性观察器添加到数组中,那么在将元素追加到数组中时是否会调用didSet 是的 问题2:如果我使用didSet将属性观察者添加到数组中,那么当元素附加到数组中时是否会调用它 是的,did

我正在做一个swift项目,我有几个阵列。在我的一个数组中,我不希望客户机能够在不使用我特别定义的方法的情况下对其进行变异。另一方面,我希望getter可以访问。我的问题是关于附加和设置属性的

问题1
私有(设置)
是否阻止客户端调用
数组。追加

在另一个阵列上,我想看看它是否已更改


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

是的

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


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

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

当属性值更改时,将调用
didSet
处理程序,该属性值在Swift中包括数组。因此,在Swift中对数组执行
append()
操作实际上类似于对整数执行
+=
操作:首先读取数组,然后使用附加值创建新数组,然后将新数组写回属性。因此,如果对数组属性调用
append()
,您可以看到它肯定会调用
didSet
,同样,通过将
set
设置为私有,外部用户将无法调用
append()
,因为他们无法将新值写回数组

  • 问题1是,因为变异函数调用会更改存储值,因此private(set)确实禁止调用变异函数
  • 问题2是的,出于同样的原因,观察员被触发

  • 这里没有特定于数组的内容,这是由于数组是结构,而
    append
    是变异成员。调用
    append
    与影响属性的新值非常相似。这并不是非常明确,但文档中有更多信息,说明语言正确地处理了变异这一事实。

    你知道这是否在任何地方都有记录吗?@onmyway133我不是问答案是否经过测试。我知道我可以自己测试。我在问文档中是否提到了答案。如果它被正式提及,向该文档添加一个链接可能会有助于未来的读者,他们希望了解更多关于此工作原理的详细信息。因此,从理论上讲,如果数组是引用类型…附加到它不会导致
    didSet
    回调?@Honey,这是正确的。对可变引用类型所做的修改是在对象的“内部”进行的,不会影响引用。另一方面,由于值类型是不可变的(更改任何内容都会创建一个全新的结构),所以整个值都在更改。这在今天的Swift中仍然是真的吗?我似乎无法在Xcode 11.4.1(又称Swift 5.2)中重现这一点。