Existenciais com any e apagamento de tipo
Use any Protocol, compreenda o custo de desempenho e saiba quando preferir genéricos.
Existenciais com any e apagamento de tipo é uma aula grátis de Swift Academy no CoddyKit. Esta é a aula 3 de 4. 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 4 aulas no total.
O que é um existencial?
Um tipo existencial encapsula qualquer valor em conformidade com um protocolo atrás de uma interface uniforme, resolvida em tempo de execução.
protocol Drawable { func draw() }
struct Line: Drawable { func draw() { print("Line") } }
let d: any Drawable = Line()
d.draw()A palavra-chave any
O Swift 5.7 exige a palavra-chave any antes dos nomes de protocolos usados como tipos existenciais para tornar o encapsulamento explícito.
func render(_ shape: any Drawable) {
shape.draw()
}
render(Line())Custo dos existenciais
Os existenciais usam alocação no heap e despacho dinâmico, o que pode ser mais lento que os genéricos com despacho estático.
// Existential – dynamic dispatch, potential heap alloc
var shapes: [any Drawable] = [Line(), Line()]
// Generic – static dispatch, no boxing
func drawGeneric<T: Drawable>(_ s: T) { s.draw() }Problema dos PATs e dos existenciais
Protocolos com tipos associados não podem ser usados como existenciais simples sem apagamento de tipo.
protocol Container { associatedtype Item }
// var c: any Container // Swift 5.7 allows with "any" but loses Item infoPadrão de apagamento de tipo
Um invólucro com apagamento de tipo envolve um tipo concreto em uma estrutura, ocultando o tipo concreto.
struct AnyDrawable: Drawable {
private let _draw: () -> Void
init<D: Drawable>(_ d: D) { _draw = d.draw }
func draw() { _draw() }
}AnySequence e AnyPublisher
A biblioteca padrão do Swift e o Combine oferecem invólucros com apagamento de tipo, como AnySequence e AnyPublisher.
import Combine
let subject = PassthroughSubject<Int, Never>()
let pub: AnyPublisher<Int, Never> = subject.eraseToAnyPublisher()eraseToAnyPublisher()
eraseToAnyPublisher() oculta a cadeia concreta de publicadores, fazendo com que os chamadores dependam apenas de AnyPublisher.
func fetch() -> AnyPublisher<String, Error> {
URLSession.shared.dataTaskPublisher(for: URL(string: "https://example.com")!)
.map { String(data: $0.data, encoding: .utf8) ?? "" }
.eraseToAnyPublisher()
}Quando os existenciais são apropriados
Use existenciais para coleções heterogêneas ou quando o tipo exato for desconhecido em tempo de compilação.
var widgets: [any Drawable] = [] // mixed concrete types OKPrefira genéricos a existenciais
Quando possível, substitua existenciais por genéricos para obter despacho estático e melhor desempenho.
// Prefer this:
func draw<T: Drawable>(_ item: T) { item.draw() }
// Over this:
func draw(_ item: any Drawable) { item.draw() }Abrindo existenciais
O Swift 5.7 ou posterior pode “abrir” um existencial ao chamar uma função genérica, extraindo automaticamente o tipo subjacente.
func drawGeneric<T: Drawable>(_ d: T) { d.draw() }
let d: any Drawable = Line()
drawGeneric(d) // compiler opens the existential automaticallyApagamento de tipo versus tipos opacos
O apagamento de tipo oculta o tipo para uso heterogêneo; tipos opacos preservam a identidade para um único tipo de retorno consistente.
let erased: any Drawable = Line() // runtime type unknown
let opaque: some Drawable = Line() // compile-time fixed typeVerificação rápida
Qual é o principal custo de desempenho dos tipos existenciais?
Recapitulação da lição
Existenciais (any Protocol) permitem polimorfismo em tempo de execução ao custo de despacho dinâmico. O apagamento de tipo envolve tipos concretos em uma interface estável. Prefira genéricos para obter desempenho; use existenciais para coleções heterogêneas.
Perguntas Frequentes
A aula “Existenciais com any e apagamento de tipo” é grátis?
Sim — o texto completo de “Existenciais com any e apagamento de tipo” é 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 4 aulas no total.
O que vou aprender em “Existenciais com any e apagamento de tipo”?
Use any Protocol, compreenda o custo de desempenho e saiba quando preferir genéricos. 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 3 de 4.
Quanto tempo leva a aula “Existenciais com any e apagamento de tipo”?
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
- Restrições genéricas e cláusulas where
- Tipos opacos com a palavra-chave some
- Existenciais com any e apagamento de tipo
- Tipos associados principais e erros tipados