0Pricing
Swift Academy · Aula

any P (existencial): compromissos e despacho dinâmico

Use any P para armazenar ou passar conformantes heterogêneos por trás de um protocolo. Entenda o despacho dinâmico, o encapsulamento e as limitações relacionadas a requisitos de associated types / Self .

any P (existencial): compromissos e despacho dinâmico é uma aula grátis de Swift Academy no CoddyKit. Esta é a aula 2 de 3. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Swift Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Swift Academy inclui 3 aulas no total.

O que é um existencial?

Existenciais (any P) contêm qualquer valor que esteja em conformidade com P. Eles permitem armazenamento heterogêneo e dispatch dinâmico, com algumas restrições.

  • Ótimos para coleções mistas
  • Dispatch dinâmico por meio de tabelas de testemunhas do protocolo
  • Limitações com tipos associados/Self

Coleção heterogênea

any Shape permite armazenar juntos valores de tipos diferentes que estejam em conformidade e chamar métodos do protocolo por meio de dispatch dinâmico.

protocol Shape { func area() -> Double }

struct Circle: Shape { let r: Double; func area() -> Double { .pi * r * r } }
struct Square: Shape { let s: Double; func area() -> Double { s * s } }

// Heterogeneous array using ANY Shape
let shapes: [any Shape] = [Circle(r: 1), Square(s: 2), Circle(r: 0.5)]
let total = shapes.reduce(0) { $0 + $1.area() }   // dynamic dispatch
print(String(format: "%.2f", total))

Limite da interface

Existenciais expõem apenas a interface do protocolo. Métodos exclusivos do tipo concreto exigem conversão descendente (que é opcional e verificada em tempo de execução).

extension Circle { func diameter() -> Double { 2 * r } }

let mixed: [any Shape] = [Circle(r: 1), Square(s: 3)]
print(mixed[0].area())            // OK: in protocol
// print(mixed[0].diameter())     // ❌ Not visible via any Shape (commented)
// You'd need a type check / downcast:
if let c = mixed[0] as? Circle { print(c.diameter()) }

ressalva sobre tipos associados

Existenciais não podem transportar diretamente tipos associados desconhecidos nem requisitos referentes a Self. Use apagamento de tipo ou fixe o tipo associado por meio de um tipo envoltório.

// Protocols with associated types/Self constraints can be hard to use as existentials.
protocol Parser {
    associatedtype Output
    func parse(_ s: String) -> Output
}

// let p: any Parser = ...     // ❌ Not directly usable: Output is unknown
// Workarounds: type erasure or constrain Output to a specific type in wrappers.

Escolhendo o estilo do parâmetro

Existencial: heterogêneo e flexível. Genérico: homogêneo e mais rápido/verificado em tempo de compilação. Escolha conforme a necessidade.

// Existential: accepts any mix of Shapes (dynamic dispatch)
func totalAreaExistential(_ xs: [any Shape]) -> Double {
    xs.reduce(0) { $0 + $1.area() }
}

// Generic (homogeneous): static dispatch; one concrete Shape type per call
func totalAreaGeneric<S: Sequence, T: Shape>(_ xs: S) -> Double
where S.Element == T {
    xs.reduce(0) { $0 + $1.area() }
}

print(totalAreaExistential([Circle(r:1), Square(s:2)]))  // mixed OK
print(totalAreaGeneric([Circle(r:1), Circle(r:2)]))      // homogeneous only
// totalAreaGeneric([Circle(r:1), Square(s:2)])          // ❌ different types

Quando usar any P

Diretrizes:

  • Use any P para armazenamento heterogêneo e polimorfismo em tempo de execução.
  • Prefira genéricos para obter desempenho e garantias estáticas quando os elementos forem homogêneos.
  • Evite existenciais para protocolos com tipos associados/Self, a menos que faça apagamento de tipo ou use um envoltório.

Benefício do existencial

Verificação rápida: O que any P permite?

Recapitulação

Recapitulação: any P é um contêiner existencial para valores conformes a um protocolo. Ele permite polimorfismo heterogêneo por meio de dispatch dinâmico, mas oculta APIs exclusivas de tipos concretos e tem dificuldades com tipos associados/Self.

Perguntas Frequentes

A aula “any P (existencial): compromissos e despacho dinâmico” é grátis?

Sim — o texto completo de “any P (existencial): compromissos e despacho dinâmico” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Swift Academy, atualize para CoddyKit PRO. O curso de Swift Academy inclui 3 aulas no total.

O que vou aprender em “any P (existencial): compromissos e despacho dinâmico”?

Use any P para armazenar ou passar conformantes heterogêneos por trás de um protocolo. Entenda o despacho dinâmico, o encapsulamento e as limitações relacionadas a requisitos de associated types / Se… Você pratica Swift Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar Swift Academy?

Nenhuma experiência prévia é necessária. Swift Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 2 de 3.

Quanto tempo leva a aula “any P (existencial): compromissos e despacho dinâmico”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de Swift Academy?

Sim. Cada aula de Swift Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. some P (tipos de resultado opacos): ocultando tipos concretos
  2. any P (existencial): compromissos e despacho dinâmico
  3. Escolhendo entre some, any e genéricos
← Voltar para Swift Academy