Мовою 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, який є деяким духовним предком Свіфта, вимагають ланцюгового дзвінка перед доступом self
, а не після.
Яке обґрунтування цього вибору вимагає визначити поля перед викликом суперконструктора?
self
.