深入理解代替单纯记忆
之前写过一篇[《Initializers in Swift Class》],后来发现对初始化方法理解还是不到位,感觉需要遵循的规则太多,太容易忘。找了些资料又看了看,发现之前还是对初始化方法的本质理解的不够
initializer本质
我理解的初始化方法的本质是:创建类,并安全地为类的成员变量赋上初始值
因为当出现复杂的继承关系时,就可能触发不安全或者某些成员变量无法赋值的情况,这里的不安全因素比如说产生无限递归调用
其实不论是Objective C还是Swift,本质是一样的,只是Swift约束更强
initializer规则
具体的规则不再赘述,下面会贴上几篇总结的很棒的文章
一个疑问
在看这些文章时,有一个问题一直百思不得解:
为什么子类的designated initializer中不能调用父类的convenience initializer?
经过一番Google,找到了答案: Why can't Swift initializers call convenience initializers on their superclass?
答案是:为了避免无限循环调用
通过下面的示例代码,一眼就能看出了
class SuperClass {
init() {
}
convenience init(value: Int) {
// calls init() of the current class
// so init() for SubClass if the instance
// is a SubClass
self.init()
}
}
class SubClass : SuperClass {
override init() {
super.init(value: 10)
}
}
// let a = SubClass()