1.可失败构造器
语法为在
init
关键字后面添加问好init?
可失败构造器的参数名和参数类型,不能与其它非可失败构造器的参数名及参数类型相同。
-
可失败构造器会创建一个类型为自身的可选类型的对象,通过
return nil
语句表明可失败构造器在任何情况下应该失败struct Animal { let species: String init?(species: String) { if species.isEmpty { return nil } self.species = species } } //如果species这个字符串为空,则构造失败。 let someCreature = Animal(species: "Giraffe") // someCreature 的类型是 Animal? 而不是 Animal if let giraffe = someCreature { print("\(giraffe.species)") } // 打印 "Giraffe"
2.构造失败的传递
类,结构体,枚举的可失败构造器可以横向代理到类型中的其他可失败构造器。类似的,子类的可失败构造器也能向上代理到父类的可失败构造器。
无论是向上代理还是横向代理,如果你代理到的其他可失败构造器触发构造失败,整个构造过程将立即终止,接下来的任何构造代码不会再被执行。
3.可失败构造器 init!
通常来说我们通过在init
关键字后添加问号的方式init?
来定义一个可失败构造器,但你也可以通过在init后面添加惊叹号的方式来定义一个可失败构造器init!
,该可失败构造器将会构建一个对应类型的隐式解包可选类型的对象。
你可以在init?
中代理到init!,反之亦然。你也可以init?
重写init!
,反之亦然。你还可以用init
代理到init!
,不过,一旦init!
构造失败,则会触发一个断言。
4.必要构造器
在类的构造器前添加required
修饰符表明所有该类的子类都必须实现该构造器:
class SomeClass {
required init() {
// 构造器的实现代码
}
}