1、可失败初始化器
定义类、结构体或枚举初始化时可以失败在某些情况下会管大用。这个失败可能由以下几种方式触发,包括给初始化传入无效的形式参数值,或缺少某种外部所需的资源,又或是其他阻止初始化的情况。 为了妥善处理这种可能失败的情况,在类、结构体或枚举中定义一个或多个可失败的初始化器。通过在 init 关键字后面添加问号( init? )来写。 通过在 init 关键字后添加问号 ( init? )的方式来定义一个可失败初始化器以创建 一个合适类型的可选项实例。另外,也可以使用可失败初始化器创建一个隐式展开具有合适类型的可选项实例。通过在 init 后面添加惊叹号( init! )而不是问号。
class Person {
var name: String
var age: Int
init ? ( name: String , age: Int ) {
self . name = name
self . age = age > 150 ? 0 : age
}
}
let per = Person ( name: "zhangsan" , age: 300 )
print ( per? . age ? ? 0 )
2、必要初始化器
在类的初始化器前添加 required 修饰符来表明所有该类的子类都必须实现该初始化器。
class Person {
var name: String
var age: Int
required init ( name: String , age: Int ) {
self . name = name
self . age = age
}
convenience init ( name: String ) {
self . init ( name: name, age: 20 )
}
}
class Teacher : Person {
var salary: Int
required init ( name: String , age: Int ) {
self . salary = 6000
super . init ( name: name, age: age)
self . name = name + "老师"
showInfo ( )
}
convenience init ( name: String ) {
self . init ( name: name, age: 30 )
}
func showInfo ( ) {
print ( "teacher name \( name) , age \( age) , salary \( salary) " )
}
}
let teacher = Teacher ( name: "李四" )
3、反初始化
每个类当中只能有一个反初始化器。反初始化器不接收任何形式参数,并且不需要写圆括号。 在类实例被释放的时候,反初始化器就会立即被调用。可以使用 deinit 关键字来写反初始 化器,就如同写初始化器要用 init 关键字一样。反初始化器只在类类型中有效。 反初始化器会在实例被释放之前自动被调用。不能自行调用反初始化器。父类的反初始化器可以被子类继承,并且子类的反初始化器实现结束之后父类的反初始化器会被调用。父类的反初始化器总会被调用,就算子类没有反初始化器。
deinit {
}