类对象构造函数代理
规则1
指定构造器必须直接调用其父类指定构造器。
规则2
便利构造器必须调用同一类另一个初始化器。
规则3
便利构造器最终必须调用指定构造器
一个简单的方法是: 指定构造器向上代理。 便利构造器横向代理

两阶段初始化
Swift中的类初始化是一个两阶段的过程。在第一个阶段,每个存储的属性由引入它的类分配一个初始值。一旦确定了每个存储属性的初始状态,第二阶段就开始了,在认为新实例已经准备好使用之前,每个类都有机会进一步定制其存储属性。
使用两阶段初始化过程使初始化安全,同时仍然为类层次结构中的每个类提供完全的灵活性。两阶段初始化可以防止属性值在初始化之前被访问,并防止属性值被另一个初始化器意外地设置为不同的值
Swift的编译器执行了四项有用的安全检查,以确保两阶段初始化没有错误地完成
Safety check 1
指定构造器必须确保在委托给超类初始化器之前,其类引入的所有属性都已初始化。
如上所述,对象的内存只有在其所有存储属性的初始状态已知之后才被认为已完全初始化。为了满足这个规则,指定构造器必须确保在传递给父类之前,它自己的所有属性都被初始化了。
Safety check 2
指定构造器在将值赋给继承的属性之前,必须将其委托给超类指定构造器。如果没有,指定构造器分配的新值将被超类覆盖,作为它自己初始化的一部分。
Safety check 3
一个便利构造器在为任何属性(包括由同一类定义的属性)赋值之前,必须委托给另一个初始化器。如果没有,便利构造器分配的新值将被它自己的指定构造器覆盖。
Safety check 4
在第一个初始化阶段完成之前,初始化器不能调用任何实例方法、读取任何实例属性的值或引用self作为值。
直到第一个阶段结束,类实例才完全有效。只有在第一阶段结束时知道类实例是有效的,才能访问属性,也只能调用方法。
自动初始化继承规则
如上所述,默认情况下,子类不继承其超类初始化器。但是,如果满足某些条件,超类初始值设定项会自动继承。在实践中,这意味着在许多常见的场景中,您不需要编写初始化器重写,并且可以在安全的情况下以最小的努力继承超类初始化器
规则1
如果你的子类没有定义任何指定构造器,它会自动继承所有超类指定构造器
规则2
如果您的子类提供了其超类指定的所有指定构造器的实现——或者通过按照规则1继承它们,或者通过提供自定义实现(重写或者以便利构造器重写父类所有指定构造器
)——那么它将自动继承所有父类便利构造器。
网友评论