Swift override fonction en extension

Si j'ai un cours:

class Spaceship<FuelType> { function prepareForLiftoff() throws { //Start the countdown! } } 

J'ai supposé à l'origine que je serais capable de replace prepareForLiftoff sans sous-class en ajoutant une extension:

 extension Spaceship where FuelType: CollectionType { func prepareForLiftoff() throws {} } 

Ce code ne comstack pas cependant, l'erreur indique invalid redeclaration de la fonction, ce qui est logique.

Ma question est la suivante: Y at-il de toute façon substituer une fonction d'une class particulière? En d'autres termes, puis-je replace la fonctionnalité dans certaines conditions comme l'exemple ci-dessus où FuelType: CollectionType . Sinon, existe-t-il une autre solution de contournement ou moyen d'get ce comportement (peut-être en déclarant un autre protocole, idk)

Maintenant que j'y pense plus, je dois dire que ce n'est pas possible parce que ce qui empêche quelqu'un de surcharger n'importe quelle fonction de bibliothèque standard?

De la documentation :

Les extensions peuvent append de nouvelles fonctionnalités à un type, mais elles ne peuvent pas replace les fonctionnalités existantes.

La documentation répertorie avec soin et précision ce qu'une extension est autorisée à faire.

En ce qui concerne votre question:

Est-il de toute façon à replace une fonction d'une class particulière

Oui, ça s'appelle sous-classment.

Au lieu de surcharger, vous pouvez essayer d'essayer. Par exemple, le code suivant vous permet d'exécuter votre propre viewWillAppear . Swift 3 :

 extension UIViewController { open override class func initialize() { // make sure this isn't a subclass guard self === UIViewController.self else { return } DispatchQueue.once(token: "viewWillAppear") { let originalSelector = #selector(self.viewWillAppear(_:)) let swizzledSelector = #selector(self.proj_viewWillAppear1(animated:)) let originalMethod = class_getInstanceMethod(self, originalSelector) let swizzledMethod = class_getInstanceMethod(self, swizzledSelector) method_exchangeImplementations(originalMethod, swizzledMethod) } } func proj_viewWillAppear1(animated: Bool) { self.proj_viewWillAppear1(animated: animated) let viewControllerName = NSSsortingngFromClass(type(of: self)) print("viewWillAppear: \(viewControllerName)") } } 

Mettre à jour 20170621

 public extension DispatchQueue { private static var _onceTracker = [Ssortingng]() public class func once(file: Ssortingng = #file, function: Ssortingng = #function, line: Int = #line, block:(Void)->Void) { let token = file + ":" + function + ":" + Ssortingng(line) once(token: token, block: block) } public class func once(token: Ssortingng, block:(Void)->Void) { objc_sync_enter(self) defer { objc_sync_exit(self) } if _onceTracker.contains(token) { return } _onceTracker.append(token) block() } }