私には拡張子があります:
public extension UIWindow {
override public func topMostController()->UIViewController? { ... }
}
しかし、私のtopMostController
については、次のエラーが表示されます。
Declarations in extensions cannot override yet error
Swift 3.1ではうまく機能しますが、Swift 4ではこのエラーが発生します。どうすれば修正できますか? Swift 4では何が変更されましたか?
拡張機能は、新しい機能を型に追加できますが、既存の機能を上書きすることはできません。
拡張機能は、既存のクラス、構造、列挙、またはプロトコルタイプに新しい機能を追加します。これには、元のソースコードにアクセスできない型を拡張する機能が含まれます(遡及モデリングと呼ばれます)。
Swiftの拡張機能:
あなたがしようとしていることは、このコードによって行われたことに似ています:
class MyClass: UIWindow {
func myFunc() {}
}
extension MyClass {
override func myFunc() {}
}
注:override topMostController()
を使用する場合は、UIWindow
のサブクラスを作成します
実際、OPコードにはいくつかの問題があります。
UIView
(UIWindow
のスーパークラス)にはメソッドtopMostController()
がないため、オーバーライドできません。
Apple 推奨しないextension
内のoverride func
:
拡張機能は、新しい機能を型に追加できますが、既存の機能を上書きすることはできません。
それでも拡張機能をオーバーライドしたい場合は、2つの方法があります。
[A]親クラスで@objc dynamic func
を使用して関数をマークします。
class Vehicle {
@objc dynamic func run() { /* do something */ }
}
class Car: Vehicle { }
extension Car {
override func run() { /* do another thing */ }
}
[B]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()
}
}