Swift 中的咬文嚼字Constant stored propertiesOverriding property getters and setters 和 overriding property observers Constant stored properties Overriding property getters and setters 和 overriding property observers

19 Oct 2017 by 晓晨

Constant stored properties

常量用做属性(constant stored properties)时感觉是被强行归到了 stored properties 中,按照我对属性的理解,所有的属性,除了 constant stored properties,本质上都是 computed properties,都是 getters 和 setters。属性里面多个它很别扭。Swift 文档中也经常直接用 stored properties 指 variable stored properties,比如,

You can add property observers to any stored properties you define, except for lazy stored properties. You can also add property observers to any inherited property (whether stored or computed) by overriding the property within a subclass. – The Swift Programming Language (Swift 4): Properties

  • Constants

  • Variables

    • Stored variables

    • Computed variables

  • Properties

    • Stored properties

      • Constant stored properties

      • Variable stored properties

    • Computed properties

      • Read-only computed properties

      • Read-write computed properties

Overriding property getters and setters 和 overriding property observers

上面两个词组在理解时是会产生歧义的。以 overriding property observers 为例,有两种理解方式,

  • Overriding (property observers)

    Override property observers 意思是覆盖属性的 observers,因为是动宾短语做标题,所以动词加 ing 变成 overriding property observers。

  • (Overriding property) observers

    Overriding property 表示覆盖别的属性的属性,再加上后面的 observers,表示一个覆盖了其父类属性的属性的 observers。

这两种解释都符合语法,但文档中要表达的意思是后者。也就是说,当我们在子类中写了一个和父类中同名的属性,就构成了覆盖,之后我们再为这个属性设定 getters、setters 或者 observers。

如果按照前者的理解就是我们在覆盖父类属性自己的 getters、setters 或 observers,这样理解明显是错的,举个例子,如果一个父类的某个属性有 observers,子类覆盖了该属性,并且提供了 observers,无论怎样实现这个子类的 observers,父类的 observers 都会在修改该属性时被调用,也就是说这里子类没有且不能覆盖父类的 observers。