扩展中的Swift覆盖函数

如果我有一个class级:

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

我原本以为我可以通过添加一个扩展来覆盖prepareForLiftoff而无需子类:

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

这个代码虽然没有编译,但是错误表示函数invalid redeclaration ,这是有道理的。

我的问题是:是否有重写某个特定类的函数? 换句话说,我可以在某些情况下replacefunction,例如FuelType: CollectionType 。 如果没有,是否有任何其他解决方法或方式来实现这种行为(也许宣布另一个协议,IDK)

现在我想了解更多,我不得不说这是不可能的,因为阻止某人重写任何标准库函数是什么原因?

从文档 :

扩展可以向types添加新的function,但是它们不能覆盖现有的function。

该文档仔细地列出了允许扩展的内容。

至于你的问题:

反正有重写一个特定的类的function

是的,这就是所谓的子类。

你可能喜欢尝试调整,而不是压倒一切。 例如下面的代码允许你运行你自己的viewWillAppearSwift 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 = NSStringFromClass(type(of: self)) print("viewWillAppear: \(viewControllerName)") } } 

更新20170621

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