Swift → Opcionals

Gui Reis
Apple Developer Academy | Mackenzie
4 min readOct 31, 2022

Se você é novo na linguagem Swift (ou até mesmo novo no mundo da programação e está começando com essa linguagem) ela tem um tipo diferente das outras linguagens, o opcional, que é representado por um ? ou !(unwrap).

Ok, mas pra que tem esse tipo? E como funciona pra lidar com ele?

Vamo lá!

O opcional em Swift é a forma de lidar com valores nulos. Ou seja, se uma variável é do tipo opcional (? ou !), ela tem a opção de ser nula! Um valor nulo em Swift é representado por nil.

Que deixe claro que nulo ≠ vazio:

  • Nulo: o valor não existe, está em branco:

Na imagem a seguir em ambos os casos são considerados nulos, a diferença é que: a primeira vai ser pedida uma atribuição pois não pode ficar nula (geralmente é pedido no construtor da classe); a segunda é do tipo opcional, podendo ser nula (no caso nil).

Exemplos de variáveis que são nulas
  • Vazio: não tem elemento; estado inicial:
Exemplo de uma variável que começa com zero e uma lista sem nenhum elemento

Beleza, agora porque são representados por !e ?? Na verdade a ideia é bem simples:

Opcional → ?

O ponto de interrogação é considerado um talvez: Quando talvez seja nula ou de fato tem algum valor. Assim, as configurações que são atribuídas pra uma variável opcional só vão acontecer quando de fato tem algum valor, quando não é nil.

Em outras palavras: O ? representa uma dúvida: pode ser nil mas também pode não ser. Isso vai ser definido no sistema em si:

Por exemplo, pra você usar uma imagem no seu código em UIKit, se usa a classe UIImage. Quando você usa ela, principalmente quando você quer usar uma imagem sua (e adicionou no projeto), ela vai te retornar uma UIImage?:

O entendimento fica mais ou menos assim:

“Olha, talvez exista uma UIImage na variável imagem".

Isso porque, nesse caso, vai ser verificado se existe mesmo o arquivo passado como parâmetro "nomeSimbolo.png"e se foi possível criar uma variável UIImage a partir disso.

Beleza, agora vou fazer algumas configurações nessa imagem, vou mexer no tamanho (.size) e na escala (.scale):

Percebe que: quando vou definir a escala e o tamanho, a ? continua aparecendo. Isso porque ele mantém o opcional e, vai considerar o caso de que não seja nulo (nil), vai considerar o caso de que existe um UIImage.

Ou seja, se foi criado mesmo uma UIImage na variável imagem com o arquivo passado, vai ser definido a escala e o tamanho.

“Se existir de fato essa UIImage, define a escala dela pra 0.5 e o tamanho pra X".

Opcional → !

O ponto de exclamação é considerado uma afirmação: Você está falando que de fato existe aquela variável, ignorando a possibilidade de ser nil.

Vou pegar o mesmo exemplo da UIImage mas com o !:

Percebe que quando você coloca o ! você não precisa mais usar nenhum ?em seguida, afinal você está AFIRMANDO COM TODA CERTEZA DO MUNDO que essa variável existe.

“Confia no pai que a variável tá ali”

? x !

O ? você consegue lidar com o caso nulo (quando for nil), já o ! não. Sendo mais direto, se em algum momento a sua variável for nil, quando estiver usando o ! o seu programa "crasha" na hora. Você está falando "confia no pai que essa variável existe, pode mexer nela" mas na verdade ela não existe.

O ! é chamado de force unwrap, isso porque a partir do momento que você afirma que aquela variável existe, ela deixa de ser opcional e passa a ser "normal". Você está forçando a remoção do opcional, essa seria a tradução mais próxima.

Sempre que você quiser ou precisar usar o opcional, use o ?, mesmo que a variável se mantenha como opcional, você está se prevenindo nos casos que podem ser nil.

Ta.. Mas eu quero usar o valor que o opcional guarda, sem ficar usando ? ou !

Aí que entra o IF, IF Let e o Guard Let, nesse outro artigo falo sobre!

--

--