先来看一段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初始化的时候实际调用的是子类Bfoo方法. 而在B.foo中使用了B.b. 如果b的初始化在super.init之后, 那么这个时候foo中的b是没有初始化的, 就会出问题.

可能这就是为什么初始化的时候需要先初始化property才能再调用super初始化方法的原因.