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") }
}