eureka custom community ios swift swift-playground swift4

ios - custom - Las declaraciones en extensiones no pueden anular aún el error en Swift 4



eureka swift (3)

Swift 5.0

En realidad, hay pocos problemas en el código OP:

  1. UIView (que es la superclase de UIWindow ) no tiene el método topMostController() , por eso no puede anularlo.

  2. Apple no fomenta la override func dentro de la extension :

    Las extensiones pueden agregar nueva funcionalidad a un tipo, pero no pueden anular la funcionalidad existente.

  3. En caso de que aún desee anular la función en la extensión, hay 2 formas:

[A] Marque su función con @objc dynamic func en la clase padre:

class Vehicle { @objc dynamic func run() { /* do something */ } } class Car: Vehicle { } extension Car { override func run() { /* do another thing */ } }

[B] Anular la función de las clases NSObject , que es descendiente de 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() } }

Tengo una extensión:

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

pero para mi topMostController obtengo el siguiente error:

Declarations in extensions cannot override yet error

Funciona bien para Swift 3.1, pero para Swift 4 obtengo este error. ¿Cómo se puede arreglar? ¿Qué cambiaron en Swift 4?


Funcionará si realiza la implementación base @objc . Vea la respuesta de Hamish para una explicación detallada sobre las partes internas.

Anular métodos declarados en extensiones es un poco difícil de hacer correctamente. Objective-C lo admite, pero no es absolutamente seguro. Swift tiene como objetivo hacerlo mejor. La propuesta aún no se ha completado.

Versión actual de la propuesta disponible here .


Las extensiones pueden agregar nueva funcionalidad a un tipo, pero no pueden anular la funcionalidad existente.

Las extensiones agregan nueva funcionalidad a una clase, estructura, enumeración o tipo de protocolo existente. Esto incluye la capacidad de extender tipos para los cuales no tiene acceso al código fuente original (conocido como modelado retroactivo).

Las extensiones en Swift pueden:

  • Agregar propiedades de instancias calculadas y propiedades de tipos calculadas
  • Definir métodos de instancia y métodos de tipo
  • Proporcionar nuevos inicializadores
  • Definir subíndices
  • Definir y usar nuevos tipos anidados
  • Hacer que un tipo existente se ajuste a un protocolo

Guía para desarrolladores de Apple

Lo que intenta hacer es similar a lo que hace este código:

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

NOTA: Si desea override topMostController() , haga una subclase de UIWindow