64 votes

Les déclarations dans les extensions ne peuvent pas encore remplacer l'erreur dans Swift 4

J'ai une extension:

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

mais pour mon topMostController j'obtiens l'erreur suivante:

 Declarations in extensions cannot override yet error
 

Cela fonctionne bien pour Swift 3.1, mais pour Swift 4, j'obtiens cette erreur. Comment peut-il être corrigé? Qu'ont-ils changé dans Swift 4?

66voto

Sulthan Points 23360

Il ne fonctionnera que si vous faites de la base de la mise en œuvre @objc. Voir Hamish réponse pour une explication détaillée sur le fonctionnement interne.

Redéfinition des méthodes déclarées dans les extensions est un peu difficile à faire correctement. Objective-C prend en charge, mais il n'est pas absolument sûr. Swift vise à faire mieux. La proposition n'est pas encore terminé.

Version actuelle de la proposition disponibles ici.

12voto

Nikhlesh Bagdiya Points 3021

Les Extensions permettent d'ajouter de nouvelles fonctionnalités à un type, mais ils ne peuvent pas remplacer les fonctionnalités existantes.

Extensions ajouter de nouvelles fonctionnalités à une classe existante, de la structure, de l'énumération, ou le type de protocole. Cela inclut la possibilité d'étendre les types pour lesquels vous n'avez pas accès au code source d'origine (connu sous le nom de rétroactivité de la modélisation).

Les Extensions de Swift peut:

  • Ajouter calculé les propriétés de l'occurrence et les propriétés de type de
  • Définir les méthodes d'instance et des méthodes de type
  • Fournir de nouveaux initialiseurs
  • Définir des indices
  • L'utilisation et la définition de nouveaux types imbriqués
  • Faire un type existant se conformer à un protocole

Apple Developer Guide

Vous essayez de faire est similaire à ce que fait ce code:

class MyClass: UIWindow {
    func myFunc() {}
}

extension MyClass {
    override func myFunc() {}
}

REMARQUE: Si vous souhaitez override topMostController() puis faire de la sous-classe d' UIWindow

3voto

dementiazz Points 119

Swift 5.0

En fait il y a quelques problèmes dans l'OP code:

  1. UIView (ce qui est super-classe de UIWindow) ne possède pas de méthode topMostController(), c'est pourquoi vous ne pouvez pas le remplacer.

  2. Apple ne veut pas encourager override func à l'intérieur d' extension:

    Les Extensions permettent d'ajouter de nouvelles fonctionnalités à un type, mais ils ne peuvent pas remplacer les fonctionnalités existantes.

  3. En cas vous voulez remplacer la fonction de l'extension, il y a 2 façons:

[A] la Marque de votre fonction avec @objc dynamic func dans la classe parent:

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

class Car: Vehicle { }

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

[B] Remplacer la fonction de construire des classes, qui est le descendant de l' 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()
    }
 }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X