Почему мы не можем добавить назначенные инициализаторы в расширения в 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) {
                ...
        }
}