在Swift语言中,要初始化一个实例,必须填写该类的所有字段,然后才调用superconstructor:
class Base {
var name: String
init(name: String) {
self.name = name
}
}
class Derived: Base {
var number: Int
init(name: String, number: Int) {
// won't compile if interchange lines
self.number = number
super.init(name)
}
}
在我看来,这是倒退的,因为需要self
在将实例赋值给其字段之前创建实例,并且该代码给人的印象是好像链接仅在赋值之后发生。除此之外,超类没有合法的手段来读取其子类的引入属性,因此在这种情况下安全性不算在内。
另外,许多其他语言(例如JavaScript),甚至是Objective C(在Swift上都是精神上的祖先),都需要在访问之前self
而不是之后进行链接调用。
在调用超构造函数之前要求定义字段的选择背后的原因是什么?
self
。