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

Свифт эквивалентен __attribute ((objc_requires_super))?

Существует ли Swift эквивалент

__attribute((objc_requires_super))

который дает предупреждение, если метод не вызывает его супер метод?

В принципе, я хочу предупредить (или даже лучше, выбросить ошибку компилятора), если переопределенный метод не вызывает его супер метод.

4b9b3361

Ответ 1

Нет, нет эквивалента Swift для __attribute((objc_requires_super)).

Эквивалентная функция Swift Attributes не содержит такого атрибута.

Раздел Swift-документация по наследованию, где упоминается такая функция, говорит только:

Когда вы предоставляете метод, свойство или переопределение индекса для подкласса, иногда полезно использовать существующую реализацию суперкласса как часть вашего переопределения.


Обратите внимание, что может предотвращать переопределение функций с помощью final, чтобы вы могли эффективно выполнять то, что хотите, предоставляя пустые переопределяемые методы, вызываемые неперекрываемыми методами:

class AbstractStarship {
    var tractorBeamOn = false

    final func enableTractorBeam() {
        tractorBeamOn = true

        println("tractor beam successfully enabled")

        tractorBeamDidEnable()
    }

    func tractorBeamDidEnable() {
        // Empty default implementation
    }
}

class FancyStarship : AbstractStarship {
    var enableDiscoBall = false

    override func tractorBeamDidEnable() {
        super.tractorBeamDidEnable() // this line is irrelevant

        enableDiscoBall = true
    }
}

Подкласс затем переопределяет переопределяемые методы, и не имеет значения, вызывали ли они super или нет, поскольку реализация суперкласса пуста.

Как Bryan Chen отмечает в комментариях, это ломается, если подкласс подклассов.

Я не претендую на то, что этот подход стилистически хорош, но это, безусловно, возможно.