1.初始化器
类,结构体,枚举都可以定义初始化器。类有两种初始化器,一种是指定初始化器,另一种是便捷初始化器。
例子:
class Persion {
//初始化器
init() {
}
//便捷初始化器
convenience init(name:String) {
self.init()
}
}
初始化器调用规则:
- 指定初始化器必须在它的直系父类中调用指定初始化器
- 便捷初始化器必须从它的相同类中调用另外一个初始化器
- 便捷初始化器最终必须调用一个指定初始化器
2.两段式初始化
第一阶段:初始化所有存储属性。
外层调用初始化器,分配内存实例,但并未初始化,指定初始化器先初始化存储属性,再调用父类初始化器,形成初始化链。
第二阶级:设置新的存储属性值
从顶部初始化器往下,链中每一个指定初始化器都会实例,初始化器可以使用self来访问修改属性,调用它的实例方法。
例子:
class Persion {
var name:String = ""
init() {
print(3)
self.name = "小白"
print(4)
}
}
class Student: Persion {
override init() {
print(2)
super.init()
print(5)
self.name = "小黑"
}
convenience init(name:String) {
print(1)
self.init()
print(6)
self.name = name
}
}
var stu = Student(name: "姓名")
3.override和required
override是重写方法,重写父类的方法都有override修饰。
required修饰的方法,子类必须继承此方法,并且需要用required修饰而不用override。
例子:
class Father{
required init () {
}
init(name:String) {
}
}
class Sun: Father {
required init() {
super.init()
}
override init(name: String) {
super.init(name: name)
}
}
4.可失败初始化器
类、结构体、枚举都可以使用init?定义可失败初始化器。
-
可失败初始化器可以调用非可失败初始化器,非可失败初始化器调用可失败初始化器需要进行解包。
-
如果初始化器调用一个可失败初始化器导致初始化失败,那么整个初始化过程都失败,并且之后的代码都停止执行 。
例子:
class Time {
var name: String
init?(name: String) {
if name.isEmpty {
return nil
}
self.name = name
}
}
var time = Time(name: "")
print(time?.name ?? "实例失败");
5.反初始化器
deinit 叫做反初始化器,类似于OC的dealloc。当类的实例对象被释放内存时,就会调用实例对象的deinit方法。
- deinit不接受任何参数,不能写小括号,不能自行调用
- 父类的deinit能被子类继承子类的deinit实现执行完毕后会调用父类的deinit
例子:
class A {
deinit {
print("A被释放")
}
}
class B: A {
deinit {
print("B被释放")
}
}
func test() {
var b = B()
}
test()
上一篇文章:swift从入门到精通11-继承
下一篇文章:swift从入门到精通13-可选链