27

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

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

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

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

4

3 回答 3

39

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

是的,它确实。

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

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

于 2015-07-02T16:13:28.377 回答
5

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

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

于 2017-04-10T15:24:31.513 回答
2
  1. 问题 1是的,因为变异函数调用会更改存储值,因此 private(set) 确实禁止调用变异函数。
  2. 问题 2是的,出于同样的原因,观察者被触发。

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

于 2017-12-01T12:55:59.120 回答