Объявления в расширениях еще не могут переопределить ошибку в Swift 4

У меня есть расширение:

public extension UIWindow {
    override public func topMostController()->UIViewController? { ... }
}

но для моего topMostController Я получаю следующую ошибку:

Declarations in extensions cannot override yet error

Это работает хорошо на Swift 3.1, но на Swift 4 я получаю эту ошибку. Как это может быть зафиксировано? Что они изменяли в Swift 4?

62
задан 2 August 2017 в 12:54

1 ответ

Быстро 5.0

На самом деле в Коде операции существует немного проблем:

  1. UIView (который является суперклассом UIWindow) не имеет метода topMostController(), это, почему Вы не можете переопределить его.

  2. Apple не поощряет override func внутренний extension:

    Расширения могут добавить новую функциональность к типу, но они не могут переопределить существующую функциональность.

  3. Упаковывают Вас, все еще хотят переопределить функцию в расширении, существует 2 пути:

Mark Вашу функцию с @objc dynamic func в родительском классе:

class Vehicle {
    @objc dynamic func run() { /* do something */ }
}

class Car: Vehicle { }

extension Car {
    override func run() { /* do another thing */ }
}

Переопределение [B] функционирует от сборки - в классах, который является потомком NSObject.

 extension UIWindow {
    // UIWindow is a descendant of NSObject, and its superclass UIView has this function then you can override
    override open func becomeFirstResponder() -> Bool {
        ...
        return super.becomeFirstResponder()
    }
 }
1
ответ дан 31 October 2019 в 14:22

Другие вопросы по тегам:

Похожие вопросы: