Sobes.tech
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:

  1. Despacho direto (Direct Dispatch):

    • O mais rápido.
    • O endereço da função é conhecido na compilação.
    • Aplicado por padrão a:
      • struct e enum (pois não suportam herança de classes).
      • Métodos final de classes.
      • Métodos private de classes (internal e public não suportam despacho direto).
      • Funções globais.
      • Métodos estáticos.
      • Extensões.
  2. 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")
        }
    }
    
  3. 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")
        }
    }
    

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.