A palavra-chave `some` em Swift e SwiftUI: para que serve?

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

O misterioso «some»: por que milhares de desenvolvedores perguntam sobre ele?

\n\n

Se você já escreveu em SwiftUI, certamente já viu a construção some View. Ela parece simples, mas os iniciantes frequentemente ficam confusos: «O que é esse «some»? Por que não posso escrever apenas View? E se eu remover o some — vai quebrar?». A pergunta «What is the "some" keyword in Swift(UI)?» acumulou milhares de visualizações no Stack Overflow — e não é por acaso. Por trás de uma palavra curta, esconde-se toda uma filosofia do Swift moderno.

\n\n

Neste artigo, vamos entender o que é a palavra-chave some, por que ela apareceu na linguagem e por que é impossível imaginar o SwiftUI sem ela. Você descobrirá como ela se relaciona com genéricos, protocolos e «tipos opacos» (opaque types). E, principalmente, entenderá como escrever um código mais limpo e eficiente.

\n\n

O problema que o «some» resolve

\n\n

Imagine que você está escrevendo uma função que retorna algum objeto que esteja em conformidade com o protocolo View. No SwiftUI, isso acontece o tempo todo:

\n\n
func makeGreeting() -> View {\n    return Text("Hello!")\n}
\n\n

O compilador Swift dirá: «O protocolo 'View' só pode ser usado como uma restrição genérica (generic constraint), porque possui requisitos de Self ou associated type». Parece assustador, mas a ideia é simples: o protocolo View no SwiftUI exige que o tipo seja conhecido em tempo de compilação. Se retornamos View — é uma abstração, e o compilador precisa de algo concreto.

\n\n

Antigamente, os desenvolvedores contornavam isso com genéricos:

\n\n
func makeGreeting<T: View>() -> T {\n    return Text("Hello!") as! T\n}
\n\n

Isso funcionava, mas parecia uma gambiarra: você promete ao compilador que retornará T, mas na verdade está «fingindo». Além disso, o código chamador precisava especificar explicitamente o tipo. Feio e inseguro.

\n\n

«Some» — o salvador do código repetitivo

\n\n

A palavra-chave some no Swift apareceu na versão 5.1 justamente para esses casos. Ela diz ao compilador: «Vou retornar um tipo específico que está em conformidade com o protocolo, mas não quero dizer o nome dele. Você mesmo o determina em tempo de compilação». Isso é chamado de tipo opaco (opaque type).

\n\n

Voltemos ao nosso exemplo:

\n\n
func makeGreeting() -> some View {\n    return Text("Hello!")\n}
\n\n

Agora o código compila! O compilador sabe que o retorno é exatamente Text, mas externamente vemos apenas some View. Isso proporciona duas coisas:

\n
    \n
  • Segurança de tipos — o compilador verifica se o tipo retornado é sempre o mesmo.
  • \n
  • Encapsulamento — ocultamos os detalhes de implementação do código chamador.
  • \n
\n\n

Comparação: «some» vs genéricos vs protocolos

\n\n

Para entender melhor a mágica do some, vamos comparar as três abordagens com um exemplo concreto. Suponha que queremos escrever uma função que retorna uma forma (círculo ou quadrado).

\n\n

1. Retorno de protocolo (não compila)

\n\n
protocol Shape {\n    func draw()\n}\n\nstruct Circle: Shape {\n    func draw() { print("Desenhando círculo") }\n}\nstruct Square: Shape {\n    func draw() { print("Desenhando quadrado") }\n}\n\n// Erro: o protocolo 'Shape' não pode ser usado como tipo de retorno\nfunc makeShape() -> Shape {\n    return Circle()\n}
\n\n

Como já sabemos — não funciona se o protocolo tiver associated types ou Self requirements.

\n\n

2. Uso de genéricos

\n\n
func makeShape<T: Shape>() -> T {\n    // Precisamos criar T de alguma forma, mas não sabemos o tipo concreto\n    fatalError("Impossível criar genérico")\n}
\n\n

Problema: o código chamador precisa saber qual tipo esperar. A função não pode decidir sozinha o que retornar.

\n\n

3. Uso de «some» (funciona perfeitamente)

\n\n
func makeShape() -> some Shape {\n                

Blogs

Book Recommendations