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
初始化方法的原因.