- 子类初始化顺序
- 子类自己需要初始化的参数
- 调用父类相应的初始化方法 super.init()
- 对父类中需要改变的成员进行设置
- Designated, Convenience, Required
- required init: 希望子类中一定实现的designated init,required强制子类重写init方法,可以保证父类的convenience init可以使用
-
class ClassA { ... required init(num:Int) { numA = num } ... } class classB { ... required init(num:Int) { numB = num + 1 super.init(num:num) } .. }
- convenience init:
- 必须调用同一个类中的designated init完成设置
- 不能被子类重写
- 不能在子类中用super的方法调用class ClassA { let numA: Int init(num: Int) {
-
numA = num } convenience init(bigNum:Bool) { self.init(num:bigNum?10000:1) } } class ClassB:ClassA { let numB: Int override init(num:Int) { numB = num + 1 super.init(num:num) } // 只要在子类中重写了父类的init方法,在子类中也可以使用父类的convenience init方法 let objB = ClassB(bigNum: true)
// objB.numA = 10000, objB.numB = 10001
// ClassB.convenience init => num = 10000 => ClassB.init => numB = num + 1 = 10001 => ClassA.convenience init => num = 10000 => ClassA.init => numA = 10000
- designated init: 在init里对let的实例常量进行赋值
-
class ClassA { let numA:Int init(num: Int) { numA = num } } class ClassB:ClassA { let numB:Int override init(num:Int) { numB = num + 1 super.init(num:num) } }
-