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 typesQuando 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
- some P (tipos de resultado opacos): ocultando tipos concretos
- any P (existencial): compromissos e despacho dinâmico
- Escolhendo entre some, any e genéricos