Swift 编译器将执行 4 种有效的安全检查,以确保两段式构造过程能不出错地完成:
安全检查 1
指定构造器必须保证它所在类引入的所有属性都必须先初始化完成,之后才能将其它构造任务向上代理给父类中的构造器。
如上所述,一个对象的内存只有在其所有存储型属性确定之后才能完全初始化。为了满足这一规则,指定构造器必须保证它所在类引入的属性在它往上代理之前先完成初始化。安全检查 2
指定构造器必须先向上代理调用父类构造器,然后再为继承的属性设置新值。如果没这么做,指定构造器赋予的 新值将被父类中的构造器所覆盖。安全检查 3
便利构造器必须先代理调用同一类中的其它构造器,然后再为任意属性赋新值。如果没这么做,便利构造器赋予的新值将被同一类中其它指定构造器所覆盖。安全检查 4
构造器在第一阶段构造完成之前,不能调用任何实例方法,不能读取任何实例属性的值,不能引用self
作为一个值。
构造器的自动继承
规则 1
如果子类没有定义任何指定构造器,它将自动继承所有父类的指定构造器。规则 2
如果子类提供了所有父类指定构造器的实现——无论是通过规则 1
继承过来的,还是提供了自定义实现——它将自动继承所有父类的便利构造器。