1.swift类的构造器
swift构造器有三种:指定构造器和, 便利构造器, 默认构造器. 其中用'convenience'修饰的构造器为便利构造器, 继承自父类的构造器及swift自动提供的构造器为默认构造器, 其他为指定构造器. 指定构造器一般只有一个, 也可以有多个.
所有便利构造器内部都必须调用本类的便利构造器或指定构造器, 但最终要调用本类指定构造器
当子类有异于父类的构造器时(一般是指定构造器, 因为子类的便利构造器最终都要调用子类的指定构造器), 子类中所有的默认构造器不可用.
💭为什么swift要在以上情况下强制默认构造器不可用呢?
声明一个属性时不设置默认值, 就必须在构造器中设置
![](https://img.haomeiwen.com/i337235/02491e80e05b7869.png)
即初始化前所有属性都必须要有一个值(特殊情况除外, 如lazy, 可选类型等)
如果子类实现了自己的指定构造器, 很可能是为了初始化子类独有的属性, 那么父类的构造器就不适合子类了, 所以就强制不可用.
但是有些构造器是有独特的作用的, 比如init?(coder aDecoder: NSCoder)方法, 于是父类用required修饰这个构造器, 需要程序猿必须要实现.
![](https://img.haomeiwen.com/i337235/ff4f28f7970de57e.png)
至于init?(coder aDecoder: NSCoder)是干什么用的, 呵呵, 一直在用loadNibNamed方法的我也有点蒙圈......
2.swfit只读属性
setter getter方法重写如图, 如果只有get没有set就是只读属性, 但是有set的话就必须要有get
![](https://img.haomeiwen.com/i337235/16c55d615c609616.png)
3.你不可以为继承来的常量存储型属性或继承来的只读计算型属性添加属性观察器。这些属性的值是不可以被设置的,所以,为它们提供
willSet
或didSet
实现是不恰当。此外还要注意,你不可以同时提供重写的 setter 和重写的属性观察器。如果你想观察属性值的变化,并且你已经为那个属性提供了定制的 setter,那么你在 setter 中就可以观察到任何值变化了。![](https://img.haomeiwen.com/i337235/4d986686e05b27e7.png)
有错望指正, 谢谢.
网友评论