Middle+
Em que momento e sob quais condições a gestão começa a funcionar em Swift?
sobes.tech IA
Resposta da IA
A despacho de métodos (method dispatch) em Swift determina qual o código será executado ao chamar um método de um objeto. O tipo de despacho é decidido em momento de compilação do código Swift.
Existem três tipos principais de despacho em Swift:
-
Despacho direto (Direct Dispatch):
- O mais rápido.
- O endereço da função é conhecido na compilação.
- Aplicado por padrão a:
structeenum(pois não suportam herança de classes).- Métodos
finalde classes. - Métodos
privatede classes (internalepublicnão suportam despacho direto). - Funções globais.
- Métodos estáticos.
- Extensões.
-
Despacho por tabela (Table Dispatch):
- Usado para
class, quando é necessário polimorfismo e herança. - O endereço da implementação concreta do método é determinado em tempo de execução (runtime) usando a tabela de métodos virtuais (vtable - Virtual Table).
- Cada classe tem sua própria vtable, contendo ponteiros para as implementações dos métodos.
- Suporta herança e sobrescrita de métodos.
class Animal { // Aplica-se o Table Dispatch func speak() { print("Som desconhecido") } } class Dog: Animal { // Sobrescrita, usa vtable override func speak() { print("Au au") } } - Usado para
-
Despacho por tabela de testemunhas (Witness Table Dispatch):
- Usado para protocolos (
protocol). - Semelhante ao despacho por tabela, mas usa uma tabela de testemunhas (witness table) para procurar a implementação do método do protocolo para um tipo específico.
- Permite usar polimorfismo com protocolos.
protocol Speakable { // Aplica-se o Witness Table Dispatch func speak() } struct Cat: Speakable { // Implementação do protocolo func speak() { print("Miau") } } - Usado para protocolos (
Condições que influenciam a escolha:
- Tipo de dado:
struct,enum,class,protocol. - Modificadores de acesso:
final,private,internal,public. - Herdabilidade: Capacidade de sobrescrever métodos.
- Conformidade a protocolos: Implementação de métodos do protocolo.
- Contexto de chamada: Chamada através de um tipo concreto ou através de um protocolo/classe base.
O compilador Swift tenta usar despacho direto sempre que possível para otimizar o desempenho, mas, se necessário, muda para despacho por tabela ou por tabela de testemunhas para suportar polimorfismo e herança. A marcação explícita de métodos como final ou private permite forçar o uso do despacho direto.