Swift 初始化方法的一个tip
先来看一段code
class A {
init() {
foo()
}
func foo {
print("A")
}
}
class B: A {
var b: Int
init(b: Int) {
self.b = b
super.init()
}
}
let b = B(b: 1)
这是一个基础的swift类继承, 这里有一个点, B的初始化方法中对b的初始化工作一定要在super.init()调用之前. 如果不这样就会报错.
这个规则都知道. 但是为啥要这样?
看下面这个例子
class A {
init() {
foo()
}
func foo {
print("A")
}
}
class B: A {
var b: Int
init(b: Int) {
self.b = b
super.init()
}
override func foo() {
print("\(self.b)")
}
}
let b = B(b: 1)
// 输出结果为: 1\n
在A的初始化方法里面调用了foo函数, 而B重写了foo方法, 在B初始化的时候实际调用的是子类B的foo方法. 而在B.foo中使用了B.b. 如果b的初始化在super.init之后, 那么这个时候foo中的b是没有初始化的, 就会出问题.
可能这就是为什么初始化的时候需要先初始化property才能再调用super初始化方法的原因.