Почему мы не можем добавить назначенные инициализаторы в расширения в swift?
единственное различие, которое я вижу между назначенными и удобными инициализаторами, заключается в том, что первый обязательно вызывает супер-класс init (если он доступен).
Я не понимаю, почему я не могу добавить назначенный init в класс в расширении, в то время как добавление удобства в порядке.
Почему так плохо иметь init от расширения, чтобы, возможно, вызвать инициализатор супер класса?
1 ответов
давайте вспомним, что такое назначенный инициализатор.
назначенный инициализатор полностью инициализирует все свойства введенный этим классом и вызывает соответствующий суперкласс инициализатор для продолжения процесса инициализации суперкласса цепь.
Отрывок Из: Apple Inc. "Язык Программирования Swift."
class ClassA {
private let propertyA: Int
init(propertyA: Int) {
self.propertyA = propertyA
}
}
class ClassB: ClassA {
private let propertyB: Int
init(propertyA: Int, propertyB: Int) {
self.propertyB = propertyB
super.init(propertyA: propertyA)
}
}
extension ClassB {
// If this was a designated initializer, you need to initialize propertyB before calling a superclass initializer.
// But propertyB is a private property that you can't access.
// If you don't have the source code of ClassB, you will not even know there is a property called propertyB.
// This is why we can't use extensions to add designated initializers.
init(propertyC: Int) {
...
}
}