类的构造过程
Swift中的类的构造过程分两个阶段,第一个阶段主要是对类中属性进行初始化,第二阶段是在实例对象准备使用对象前进一步自定义存储属性。。
必须遵守的四大规则:
- 指定初始化器必须保证在向上委托给父类初始化器之前,其所在类引入的所有属性都要初始化完成。
- 指定初始化器必须先向上委托父类初始化器,然后才能为继承的属性设置新值。如果不这样做,指定初始化器赋予的新值将被父类中的初始化器所覆盖
- 便捷初始化器必须先委托同类中的其它初始化器,然后再为任意属性赋新值(包括同类里定义的属性)。如果没这么做,便捷构初始化器赋予的新值将被自己类中其它指定初始化器所覆盖。
- 初始化器在第一阶段初始化完成之前,不能调用任何实例方法、不能读取任何实例属性的值,也不能引用 self 作为值。
第一阶段:
调用类的指定构造器或者便利构造器。
对类的实例对象进行内存分配,但内存未被初始化(不能通过self访问)
调用的构造器保证类中引入的相关属性都已经初始化,属性所属内存也完成分配。
构造器向上切换到父类构造器,对父类存储属性完成跟子类一样的任务。
不断往上层切换,直到最顶端。此时所有存储属性都已初始化,实例内存也完成初始化,该阶段完成
第二阶段:
从顶端往下,构造器可以通过self来访问或者修改属性以及调用实例方法。
构造器的继承与重写
构造器的继承与重写规则如下:
- 如果子类构造器和父类指定构造器相匹配·,需要在子类构造器加上override关键字
- 子类构造器与父类便利构造器相匹配,不需要加override修饰符。
- 若父类没有有参构造器,子类构造器也没有自定义父类相关属性,那么子类可以省略super.init()
示例:
构造器的自动继承
如果子类中所有新属性都有了初始值,那么以下两个规则将适用:
- 子类没有定义任何指定构造器,会继承父类所有指定构造器
- 如果子类提供了所以父类指定构造器的实现,将自动继承父类所有便利构造器
可失败构造器的重写
当你在父类中定义了一个可失败的构造器,那么你可以在子类中重写一个不可失败构造器,只需要在构造器前面加上override。
但是你不可以将父类不可失败构造器重写成可失败构造器:
对于必要构造器的重写,子类只需要添加required关键字,不需要加上override