3
为什么Swift首先要初始化子类的适当字段?
在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而不是之后进行链接调用。 在调用超构造函数之前要求定义字段的选择背后的原因是什么?