Sobes.tech
Middle

Que despacho é utilizado para extensões (extensions) em Swift?

sobes.tech IA

Resposta da IA

A gestão de chamadas para métodos implementados em extensões depende do tipo de extensão e do caráter do método chamado:

  • Despacho dinâmico (Dynamic Dispatch): Usado para métodos definidos em protocolos e extensões desses protocolos, quando o método é chamado através de uma variável de tipo protocolo. Também se aplica a métodos de extensões de classes.

  • Despacho estático (Static Dispatch): Usado para métodos definidos em extensões de estruturas e enumerações. A chamada a essas funções é determinada em tempo de compilação.

  • Despacho misto (Witness Table): Para extensões de protocolos com implementação padrão. Se o tipo que implementa o protocolo já fornece uma implementação do método, essa será usada (despacho dinâmico). Caso contrário, a implementação da extensão será chamada através da Tabela de Testemunhas (semelhante ao despacho estático, mas para protocolos).

Exemplo:

// Extensão de uma classe - despacho dinâmico ao chamar através de uma variável de tipo base
class BaseClass {
}

extension BaseClass {
    func virtualMethod() {
        print("Extensão de BaseClass")
    }
}

class DerivedClass: BaseClass {
    // Sobrescrever o método de extensão é possível, mas não comum
    // override func virtualMethod() { print("Extensão de DerivedClass") }
}

// Extensão de uma estrutura - despacho estático
struct MyStruct {
}

extension MyStruct {
    func staticMethod() {
        print("Extensão de MyStruct")
    }
}

// Extensão de um protocolo
protocol MyProtocol {
    func protocolMethod()
}

extension MyProtocol {
    func protocolMethod() { // Implementação padrão
        print("Implementação padrão do protocolo")
    }
}

struct ConformingStruct: MyProtocol {
    // Se descomentar, esta implementação será usada
    // func protocolMethod() { print("Implementação de ConformingStruct") }
}