0Pricing
Swift Academy · Aula

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 info

Padrã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 OK

Prefira 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 automatically

Apagamento 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 type

Verificaçã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

  1. Restrições genéricas e cláusulas where
  2. Tipos opacos com a palavra-chave some
  3. Existenciais com any e apagamento de tipo
  4. Tipos associados principais e erros tipados
← Voltar para Swift Academy