Swift Academy · Aula

Escolhendo entre some, any e genéricos

Escolha genéricos para tipagem estática homogênea, some P para ocultar um tipo concreto fixo e any P para polimorfismo heterogêneo.

Aula 3 de 38 etapas

Escolhendo entre some, any e genéricos é uma aula grátis de Swift Academy no CoddyKit. Esta é a aula 3 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.

Quando usar cada um?

Regra prática:

  • Genéricos: o mesmo tipo concreto por chamada; melhores verificações em tempo de compilação e desempenho.
  • some P: oculta o tipo concreto de retorno, fixo por função.
  • any P: combina tipos conformes (heterogêneos), com dispatch dinâmico.

Genéricos: homogêneos

Genéricos são ideais para dados homogêneos e otimização (dispatch estático, expansão de funções).

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 } }

// Generic: one concrete Shape type per call site (homogeneous)
func totalAreaGeneric<S: Sequence, T: Shape>(_ xs: S) -> Double where S.Element == T {
    xs.reduce(0) { $0 + $1.area() }
}
print(totalAreaGeneric([Circle(r:1), Circle(r:2)]))  // OK
// totalAreaGeneric([Circle(r:1), Square(s:2)])      // ❌ different types

Opaco: oculto, mas fixo

some P retorna um tipo fixo, porém oculto. É uma ótima opção quando você quer encapsulamento sem perder o desempenho estático.

// Opaque factory hides the concrete type while guaranteeing Shape
func unitShape(flag: Bool) -> some Shape {
    // Must return the SAME underlying type on all paths; pick one.
    Circle(r: 1)
}
let s = unitShape(flag: true)
print(String(format: "%.2f", s.area()))  // 3.14

any P: heterogêneo

any P permite tipos mistos em uma única coleção ou variável; o dispatch dos métodos ocorre dinamicamente por meio da interface do protocolo.

// Existential: store mixed conformers
let mixed: [any Shape] = [Circle(r: 1), Square(s: 2)]
let sum = mixed.reduce(0) { $0 + $1.area() }   // dynamic dispatch
print(String(format: "%.2f", sum))

Formatos de API comparados

Escolha a superfície:

  • Genérico: quem chama controla o tipo concreto.
  • Opaco: você oculta o tipo, que é fixo por função.
  • Existencial: você pode variar os tipos concretos dinamicamente.
// Three API shapes for the same idea: "make a Shape"

// 1) Generic return — exposes concrete type to caller
func makeGeneric<T: Shape>(_ t: T) -> T { t }

// 2) Opaque return — hides concrete type but fixed
func makeOpaqueCircle() -> some Shape { Circle(r: 1) }

// 3) Existential return — can return any conformer
func makeExistential(_ big: Bool) -> any Shape { big ? Square(s: 3) : Circle(r: 1) }

let g: Circle = makeGeneric(Circle(r: 2))      // caller knows concrete type
let o = makeOpaqueCircle()                      // caller sees only Shape
let e = makeExistential(true)                   // could be Circle or Square at runtime
print(g.area(), o.area(), e.area())

Resumo rápido

Diretrizes:

  • Prefira genéricos para obter desempenho e tipagem forte quando os dados forem homogêneos.
  • Use some P para ocultar tipos de retorno e manter as APIs estáveis.
  • Use any P para coleções semelhantes a plug-ins ou mistas.
  • Evite any P para protocolos com tipos associados/Self, a menos que faça apagamento de tipo.

Verificação de decisão: escolher some/any/genéricos

Verificação rápida: Qual opção oculta um tipo concreto de retorno fixo por trás do protocolo P?

Recapitulação

Recapitulação:

  • Genéricos = homogêneos, mais rápidos, mais estáticos.
  • some P = oculta o tipo concreto, fixo por função.
  • any P = heterogêneo, com dispatch dinâmico.
Grátis para começar

Aprenda Swift com um tutor de IA — grátis

Escreva e execute código real no seu navegador, obtenha ajuda instantânea de um tutor de IA 24/7 e continue de onde parou na web ou no app.

Cursos
122
Aulas
409

Perguntas Frequentes

A aula “Escolhendo entre some, any e genéricos” é grátis?

Sim — o texto completo de “Escolhendo entre some, any e genéricos” é 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 “Escolhendo entre some, any e genéricos”?

Escolha genéricos para tipagem estática homogênea, some P para ocultar um tipo concreto fixo e any P para polimorfismo heterogêneo. 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 3.

Quanto tempo leva a aula “Escolhendo entre some, any e genéricos”?

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