Optional

Optional Swift

Quando declaramos uma variável ou constante, elas vão armazenar apenas o tipo de dado definido no momento da declaração, por exemplo: uma variável idade do tipo Int, só pode conter valores inteiros.

Contudo, em Swift, nós podemos fazer com que além do tipo de dado armazenado por uma variável ou constante, ela também possa representar a ausência de um valor.

Para fazer isso, nós utilizamos um tipo chamado Optional, que representa um valor empacotado (Wrapped) ou nil (Vazio, ausência de valor).

Declarando um Optional

Para declarar um elemento com o tipo Optional, basta acrescentar o símbolo ? ou ! após a definição do tipo.

No exemplo a seguir, declaramos duas variáveis: nome do tipo String e idade do tipo Int. Ambas as variáveis são optionals, e como nenhum valor foi atribuído elas retornarão nil, indicando a ausência de valor:


Atribuindo e Acessando Valores

A atribuição de valores a uma variável ou constante do tipo Optional é feita da mesma maneira que outros tipos como Int, String, Double, etc. A única diferença é que agora podemos atribuir o valor nil.

Quando uma optional estiver armazenado um valor, ela retornará aquele valor empacotado em um Optional. Caso não contenha nenhum valor, retornará nil.

Para acessar o valor de uma optional, podemos utilizar um método chamado unwrapping (desempacotamento), onde adicionamos o símbolo ! após chamar a variável/constante.

Mas tome cuidado, pois este método só pode ser utilizado quando você tiver certeza que o optional possui um valor na hora do acesso, caso contrário, o programa vai ter um erro fatal.

Da mesma forma que fazer unwrapping em um optional que não esteja armazenando nada causará um erro fatal, tentar atribuir o valor de um optional a uma variável/constante que não seja do tipo optional também vai resultar em um erro de execução:


Manipulando Optionals

Como é possível observar, utilizar apenas o ! para desempacotar um optional pode ser complicado e torna o programa mais propenso a erros, pois ele basicamente força o programa a tratar aquela variável como tendo um valor, mas caso o valor seja nil um erro fatal vai ocorrer.

Felizmente, nós temos outro método para desempacotar um optional, chamado de conditional unwrapping, onde nós utilizamos estruturas condicionais para checar se uma variável/constante tem um valor.

Estas estruturas verificam se uma variável possui um valor e retornam ele caso exista, ou nos permitem tomar alguma ação caso não tenha.

A seguir vamos mostrar algumas técnicas para desempacotar optionals usando estruturas condicionais:

Condicional - if

Podemos utilizar uma condicional para verificar se um valor equivale ou não a nil usando == ou !=. O ponto negativo de utilizar este método é que vamos continuar precisando desempacotar o valor a todo o momento.


Vinculação de Optional (Optional Binding) - if-let e guard-let

De forma similar, podemos utilizar if-let e guard-let para vincular o valor de uma optional a algum valor temporário.

No exemplo a seguir usamos o if-let para armazenar na constante cepTemporario o valor de cep:

O guard-let é similar ao if-let, com a diferença de ele trata apenas os casos onde o optional não contém valor e encerra a execução daquele bloco de código com o return.


Operador Nil-Coalescing - ??

É possível prover um valor predefinido caso uma optional retorne um valor nil, utilizando o operador ??.

Próximo
Próximo

Tuple