Подтвердить что ты не робот

Что означает "требуемое" ключевое слово в Свифт?

Возьмем следующий пример:

class A {
    var num: Int

    required init(num: Int) {
        self.num = num
    }
}

class B: A {
    func haveFun() {
        println("Woo hoo!")
    }
}

Я отметил A init функцию как required. Что именно это значит? Я полностью опустил его в подклассе B, и компилятор вообще не жалуется. Как это требуется, тогда?

4b9b3361

Ответ 1

См. "Наследование автоматического инициализатора" :

Правило 1 Если ваш подкласс не определяет какие-либо назначенные инициализаторы, он автоматически наследует все его инициализаторы, назначенные суперклассам.

Правило 2 Если ваш подкласс обеспечивает реализацию всех его суперклассы, назначенные инициализаторы, либо путем наследования их в соответствии с правило 1, или путем предоставления пользовательской реализации как части ее определение - тогда он автоматически наследует все суперклассы инициализаторы удобства.

В вашем примере подкласс B не определяет никаких инициализаторов самостоятельно, поэтому он наследует все инициализаторы от A, включая требуемый инициализатор. То же самое верно, если B определяет только удобные инициализаторы (теперь обновлено для Swift 2):

class B: A {

    convenience init(str : String) {
        self.init(num: Int(str)!)
    }

    func haveFun() {
        print("Woo hoo!")
    }
}

Но если подкласс определяет любой назначенный (= неудобный) инициализатор, то он не наследует инициализаторы суперкласса. В частности, требуется инициализатор не наследуется, поэтому это не скомпилируется:

class C: A {

    init(str : String) {
        super.init(num: Int(str)!)
    }

    func haveFun() {
        print("Woo hoo!")
    }
}
// error: 'required' initializer 'init(num:)' must be provided by subclass of 'A'

Если вы удалите метод required from A init, тогда класс C компилируется также.

Ответ 2

Ключевое слово required означает, что наследование классов должно обеспечивать реализацию метода. Однако язык делает исключение для необходимых инициализаторов:

Вам не нужно предоставлять явную реализацию требуемого инициализатора, если вы можете удовлетворить требование с помощью унаследованного инициализатора.

Ссылка на документацию

Ответ 3

"Использование необходимого модификатора гарантирует, что вы предоставите явную или унаследованную реализацию требования инициализатора во всех подклассах соответствующего класса, чтобы они также соответствовали протоколу".

Отрывок из: Apple Inc. "Язык быстрого программирования (Swift 2)". интерактивные книги. https://itun.es/us/jEUH0.l