知识卡片

指定初始化方法与便捷初始化方法的委托链

专业/工作 · 751

内容

类的每个初始化方法要么是指定初始化方法(无需修饰符,负责让本类新增的属性全部有值),要么是便捷初始化方法(用convenience标记,自己不直接初始化属性,而是调用同类的另一个初始化方法)。所有便捷初始化方法最终都必须沿着委托链走到某个指定初始化方法;子类的指定初始化方法则必须在给自己新增的属性都赋值完成之后,再调用super.init(...)把控制权交给父类完成父类那部分属性的初始化——顺序不能颠倒,因为子类的属性必须先备齐,父类初始化方法才有权访问一个”完整”的self。这条规则把”实例创建完成前所有存储属性必须有值”的约束,从单个类型延伸到[[继承是类独有的能力]]所建立的整条继承链,任何一环缺失编译器都会报错,而不是留到运行时才炸出未初始化字段的bug。

参考来源

《Swift编程权威指南》第17章《初始化》