Swift-Versand zum Überschreiben von Methoden in Unterklassenerweiterungen

Überschreibende Methodensignaturen in Erweiterungen scheinen in bestimmten Fällen zu unvorhersehbaren Ergebnissen zu führen. Das folgende Beispiel zeigt zwei unterschiedliche Ergebnisse mit einem ähnlichen Muster.

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()

Dies druckt:

dothing super class
viewdidload subclass
viewdidload superclass

Sie können sehen, dass das @ übersprungen wiB 's Implementierung vondoThing wenn es als @ besetzt iA enthält jedoch beide Implementierungen vonviewDidLoad wenn als @ besetUIViewController. Ist das das erwartete Verhalten? Wenn ja, woran liegt das?

ENV: Xcode 7.3, Spielplatz

Antworten auf die Frage(2)

Ihre Antwort auf die Frage