Envio rápido para métodos substituídos em extensões de subclasse

substituir assinaturas de método em extensões parece produzir resultados imprevisíveis em certos casos. O exemplo a seguir demonstra dois resultados diferentes com um padrão semelhante.

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

Isso imprime:

dothing super class
viewdidload subclass
viewdidload superclass

Você pode ver isso pular oBimplementação dedoThing quando é lançado comoA, no entanto, inclui as duas implementações deviewDidLoad quando lançado comoUIViewController. Este é o comportamento esperado? Se sim, qual o motivo disso?

ENV: Xcode 7.3, Parque infantil

questionAnswers(1)

yourAnswerToTheQuestion