Sobes.tech
Junior — Middle

Qual mecanismo de despacho é aplicado ao chamar um método definido em um protocolo que foi estendido usando uma Extensão?

sobes.tech IA

Resposta da IA

Em Swift, se um método estiver definido num protocolo e, posteriormente, o protocolo for estendido através de uma extensão com a implementação desse método, a chamada do método através de uma referência ao protocolo usa a despachagem estática (static dispatch). Isso significa que a chamada do método será direcionada para a implementação da extensão do protocolo, e não para a implementação num tipo específico, mesmo que o tipo a sobrescreva.

Em outras palavras, os métodos implementados em extensões de protocolos não suportam despachagem dinâmica (dynamic dispatch), ao contrário dos métodos obrigatórios do protocolo implementados nos tipos.

Exemplo:

protocol MyProtocol {
    func requiredMethod()
}

extension MyProtocol {
    func requiredMethod() {
        print("Implementação padrão na extensão")
    }
}

struct MyStruct: MyProtocol {
    func requiredMethod() {
        print("Implementação em MyStruct")
    }
}

let instance: MyProtocol = MyStruct()
instance.requiredMethod() // Vai imprimir "Implementação padrão na extensão"

Isto ocorre porque os métodos de extensões de protocolos não estão na tabela de chamadas virtuais (vtable) e são chamados diretamente.