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:
-
UIView
(que es la superclase deUIWindow
) no tiene el métodotopMostController()
, por eso no puede anularlo. -
Apple no fomenta la
override func
dentro de laextension
:Las extensiones pueden agregar nueva funcionalidad a un tipo, pero no pueden anular la funcionalidad existente.
-
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