可失败构造器适用于类,结构体,枚举类型
语法为在init
后加一个问号?
,为init?()
需要特别注意的是,可失败构造器返回的是这个类实例的可选类型,意思就是返回值不同,需要注意,返回值不同并不是方法原型的一部分,所以不可以出现参数表相同,返回值不同的构造器,例如:同一类中存在:
init(){
}
init?(){
}
错误的,因为无法区分这两个方法
严格来说,构造器不返回任何值,只是理解我们这么理解
可失败构造器:
init?(){
if(条件){
return nil
}
语句
}
在swift3中,return nil的时机可以任意,swift2中却是在本类属性完全初始化后,swift3已经得到改进
可失败构造器的传递
可失败构造器也可以向上或者横向代理到其他的可失败构造器,一旦其中一个失败,则整个构造过程结束
可失败构造器和正常构造器和关系,可以互相调用,保持类型一至即可
可失败调用非可失败,OK
非可失败调用可失败,需要解析值
重写可失败构造器
可以重写,没问题,
可失败->非可失败 需要解析值
非可失败->可失败 不行
可失败构造器 init!
通常是init?()
,也可以用init!()
,表示强制解包可选类型对象
可以init?
代理到init!
,反之亦然
可以init?
重写init!
,反之亦然
还可以用init
代理到init!
,init!
构造失败,触发断言
类似这样
class A {
init!() {
return nil
}
}
class B: A {
override init(){
super.init()//失败,触发断言,强制解析可选类型为空
}
}