swift构造器

指定构造器

初始化类中提供的所有属性,并根据父类链往上调用父类的构造器来实现父类的初始化。

最终都是通过指定构造器初始化对象,保证每个储值属性都有值

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() {
        // 构造器的实现代码
    }

你可能感兴趣的:(swift构造器)