В языке 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 и даже Objective C, который является в некоторой степени духовным предком Swift, требуют цепного вызова до доступа self
, а не после.
Что является причиной такого выбора, требующего определения полей перед вызовом суперконструктора?
self
.