可失败构造器(Failable initializers):
直到一个可失败构造器完成了它所有的初始化任务,它才可以:return nil。因此,比如一个可失败子类构造器必须在所有的子类属性被初始化和调用super.init( ) 之后才可以return nil。(这里有一个有趣的讽刺:在销毁实例之前,构造器必须完成建立实例;但是,为了保证父类有一个清晰的的初始化,这个工作又是必须的。)
如果一个被可失败构造器调用的构造器是可失败的,这个调用语法不会改变,并且也不需要其他的检查——如果一个被调用的可失败构造器失败了,那么整个初始化进程将立刻失败并终止。
对于重写与代理,一个返回隐式解包(init!)的可失败构造器与正常构造器被一样对待。对于返回可选值的可失败构造器(init?),这里有一些额外的限制要求:
1、init可以重写init? , 反之不可以
2、init?可以调用init
3、init可以调用init? (通过使用init并!解包,如果用?,失败情况会导致程序崩溃)
具体见下示例:
TIPS:
子类构造器绝不可以为父类设置常量(let),这是因为在允许子类做 除了不能初始化自己的属性和调用另一个构造器之外 所有事 的时候,父类已经完成了自身的初始化。