Swift言語では、インスタンスを初期化するには、そのクラスのすべてのフィールドに入力し、その後でスーパーコンストラクターを呼び出す必要があります。
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のような他の多くの言語や、Swiftのいくらか霊的な祖先であるObjective Cでさえ、アクセスする前self
ではなく、アクセスする前にチェーン呼び出しが必要です。
スーパーコンストラクタを呼び出す前にフィールドを定義する必要があるというこの選択の背後にある理由は何ですか?
self
。