エクステンションのメソッドシグネチャをオーバーライドすると、特定のケースで予期しない結果が発生するようです。次の例は、同様のパターンを持つ2つの異なる結果を示しています。サブクラス拡張のオーバーライドされたメソッドへの迅速なディスパッチ
class A: UIViewController {
func doThing() {
print("dothing super class")
}
override func viewDidLoad() {
print("viewdidload superclass")
super.viewDidLoad()
}
}
class B: A { }
extension B {
override func doThing() {
print("dothing sub class")
super.doThing()
}
override func viewDidLoad() {
print("viewdidload subclass")
super.viewDidLoad()
}
}
let a: A = B()
a.doThing()
let vc: UIViewController = B()
vc.viewDidLoad()
これは、出力します。あなたはそれがA
としてキャストされたときに、これはdoThing
のB
の実装をスキップして見ることができます
dothing super class
viewdidload subclass
viewdidload superclass
UIViewController
としてキャストするとき、しかしviewDidLoad
の両方の実装が含まれています。これは期待される行動ですか?もしそうなら、これはどうしてですか?
ENV:Xcodeの7.3、遊び場
スーパークラスで 'dynamic func doThing()'を試してみてください。 – jtbandes
@jtbandes期待される結果が得られます(つまり、サブクラス実装とスーパークラス実装の両方を呼び出します)。しかし、なぜそれが要求され、 'UIViewController'にキャストされたときの振る舞いと違うのかについて私は明確ではありません。モジュールの範囲に基づいて動作が異なりますか? – ahtierney