美文网首页
深入属性

深入属性

作者: inclee | 来源:发表于2017-02-15 16:02 被阅读0次

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

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

    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对于计算属性来说不能算是属性观察器么?
    从只读上说计算属性和存储属性

    相关文章

      网友评论

          本文标题:深入属性

          本文链接:https://www.haomeiwen.com/subject/vpjqwttx.html