指定构造器
初始化类中提供的所有属性,并根据父类链往上调用父类的构造器来实现父类的初始化。
最终都是通过指定构造器初始化对象,保证每个储值属性都有值
init(parameters) {
statements
}
便利构造器
次要的、辅助型的构造器
convenience init(parameters) {
statements
}
- 指定构造器必须总是向上代理
- 便利构造器必须总是横向代理,并且最终必须导致一个指定构造器被调用
两段构造过程
类似OC:
- 第1阶段,每个存储型属性被引入它们的类指定一个初始值。
- 第2阶段,它给每个类一次机会,在新实例准备使用之前进一步定制它们的储值属性。
编辑器4种安全检查
- 1.子类必须先保证自己新增的属性初始化完成,之后才能代理给父类
- 2.指定构造器必须先向上代理调用父类构造器,然后再为继承的属性设置新值(否则该值会被父类覆盖)
- 3.便利构造器必须先代理调用本类中的其它构造器,然后再为任意属性赋新值(否则该值会被本类指定构造器覆盖)
- 4.构造器在第1阶段构造完成之前,不能调用任何实例方法,不能读取任何实例属性的值,不能引用self作为一个值
构造器的继承和重写
子类默认情况下不会继承父类的构造器,以下2种情况会继承父类:
假设子类新属性都有默认值
- 1.如果子类没有定义任何指定构造器,它将自动继承所有父类的指定构造器。
- 2.子类实现了所有父类的指定构造器(无论是情况1,还是重写了所有父类的指定构造器),它将自动继承所有父类的便利构造器。
注意 :
子类可以在初始化时修改继承来的变量属性,但是不能修改继承来的常量属性。
可失败构造器 init? init!
一个类、结构体或枚举类型的对象,在构造过程中有可能失败,则为其定义一个可失败构造器。这里所指的“失败”是指,如给构造器传入无效的参数值,或缺少某种所需的外部资源,又或是不满足某种必要的条件等。
可失败构造器的参数名和参数类型,不能与其它非可失败构造器的参数名,及其参数类型相同。
必须构造器
required init() {
// 构造器的实现代码
}