Swift имеет очень четкую, определенную последовательность операций, выполняемую в инициализаторах. Начнем с некоторых базовых примеров и переходим к общему случаю.
Возьмем объект A. Мы определим его следующим образом.
class A {
var x: Int
init(x: Int) {
self.x = x
}
}
Заметим, что A не имеет суперкласса, поэтому он не может вызвать функцию super.init (), поскольку он не существует.
OK, поэтому теперь давайте подкласс A с новым классом с именем B.
class B: A {
var y: Int
init(x: Int, y: Int) {
self.y = y
super.init(x: x)
}
}
Это отклонение от Objective-C, где [super init]
обычно вызывается сначала перед чем-либо еще. Не так в Свифт. Вы несете ответственность за то, чтобы ваши переменные экземпляра находились в согласованном состоянии до того, как вы сделаете что-либо еще, включая методы вызова (который включает инициализатор вашего суперкласса).