A substituição da implementação padrão do protocolo em uma sub-classe não participa do envio dinâmico [duplicado]

Esta pergunta já tem uma resposta aqui:

Substituição de extensões de protocolo Swift 5 respostas

Considere o seguinte playground:

protocol A {
    func f() -> String
}

extension A {
    func f() -> String { return "AAAA" }
}

class B: A {}

class C: B {
    func f() -> String { return "CCCC" }
}

let a: A = C()
let b: B = C()
let c: C = C()

a.f() // "AAAA" - why?
b.f() // "AAAA" - why?
c.f() // "CCCC"

Eu não entendo o porquêa.f() eb.f() Retorna"AAAA" - eles deveriam voltar"CCCC" Porquefunc f() -> String deve ser enviado dinamicamente (como declarado no protocolo).

Se eu mudarclass B para ficar assim:

class B: A {
    func f() -> String { return "BBBB" }
}

então todas as três chamadas para.f() Retorna"CCCC" como esperado.

Eu sinto que é um bug no compilador Swift, verifiquei no Xcode 7.3.1 e 8.0-beta3, esse comportamento é reproduzível em ambos.

Esse é realmente um comportamento esperado?

questionAnswers(1)

yourAnswerToTheQuestion