深入属性

为什么计算属性不能有默认值

引用苹果官方文档的一句话

In addition to stored properties, classes, structures, and enumerations can define computed properties, which do not actually store a value. Instead, they provide a getter and an optional setter to retrieve and set other properties and values indirectly.
除了存储属性以外,class ,struct,enum还可以定义计算属性,计算属性实际上不存储值,而是通过提供个getter方法和可选的setter方法间接的去获取和设置其他属性的值。

可以看到存储属性作为一个变量或常量在实例中是实实在在存在的,而计算属性实质上确实不存在,对于一个不存在的量也就没有所谓的初始值/默认值的概念。

为什么存储属性没有getter/setter,为什么计算属性没有属性观察器

存储属性才有属性观察器(lazy除外),并且没有get/set
计算属性才有get/set,并且没有属性观察器

  • 1存储属性是没有get和set的,这个设计和其他语言看似不同。如Objective-C中属性由背后的实例变量+方法方法组成(如果不提供属性的访问方法,那么系统会默认生成),访问属性实质上通过访问方法访问的内部的实例变量。而Swift的属性没有所谓的实例变量,访问属性就是直接访问的属性部分。
    存储属性为什么不提供get/set?我认为已经提供了就是willSet和didSet
    willSet对应setter | didSet对应get,也就是我为什么说和其他语言看似不同的原因了
  • 2 计算属性为什么不需要属性观察器?
    从上面可以看出,真正对对象实例本身产生修改的还是存储属性,而且对计算属性本身的设置最终还是反应在存储属性上的,在最后修改的存储属性的地方可以捕获修改事件不就可以了么?更何况set对于计算属性来说不能算是属性观察器么?
从只读上说计算属性和存储属性

你可能感兴趣的:(深入属性)