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