Swift 中构造器需要遵循的规则还是很多的, 总结一下, 有以下规则:

调用相关

    指定构造器必须调用它直接父类的指定构造器方法.

    便利构造器必须调用同一个类中定义的其它初始化方法.

    便利构造器在最后必须调用一个指定构造器.

  属性相关

    指定构造器必须要确保所有被类中提到的属性在代理向上调用父类的指定构造器前被初始化, 之后才能将其它构造任务代理给父类中的构造器.

    指定构造器必须先向上代理调用父类中的构造器, 然后才能为任意属性赋值.

    便利构造器必须先代理调用同一个类中的其他构造器, 然后再为属性赋值.

    构造器在第一阶段构造完成之前, 不能调用任何实例方法, 不能读取任何实例属性的值,self 不能被引用.

  继承相关

     如果子类没有定义任何的指定构造器, 那么会默认继承所有来自父类的指定构造器.

  •   如果子类提供了所有父类指定构造器的实现, 不管是通过上一条规则继承过来的, 还是通过自定义实现的, 它将自动继承所有父类的便利构造器.

  • 父类中,定义了一个 制定构造器,加上required后:

1

2

3

4

5


classSomeClass {

required init() {

// initializer implementation goes here

}

}



表示:

子类中必须要实现这个required init

并且子类的写法,也是:

1

2

3

4

5


    classSomeSubclass: SomeClass {

    required init() {

    // subclass implementation of the required initializer goes here

    }

}


而不是写override

同时,子类的子类,也必须要实现这个required init。

所以此处的required init,就只是继承实现了父类的required init而已。

暂时无需太关心。

总结】

至此,基本明白了:

1

2

3


init() {

super.init(nibName: nil, bundle: nil)

}


是当前子类的制定构造器。

并且要在初始化子类自己的所有的变量之后,再去调用父类的init。

具体的init的参数,取决于所继承的父类(可以通过看父类的源码而得知)

以及初始化参数,一般无需太操心时,往往都是nil

1

2

3


required init?(coder aDecoder: NSCoder) {

super.init(coder: aDecoder)

}


是实现了,父类中的required init而已。

其内部实现,继续只是调用父类的init而已。没啥特殊的。