Nesse artigo vou falar sobre os condicionais (tema do artigo) voltado para as variáveis do tipo optional, afinal o IF Let e o Guard Let são usados apenas com opcionals
Caso tenha alguma dúvida sobre o que são optionals, de uma olhada nesse outro artigo que eu fiz que fala sobre eles :)
IF
O if em swift é o tradicional em todas as linguagens, não tem segredo.
Mas ele também pode ser usado pra verificar se uma determinada variável do tipo opcional possui um valor e não é simplesmente vazia usando uma simples comparação:
IF Let
O IF Let se usa com variáveis do tipo opcional necessariamente. É usado quando você vai precisar usar o valor de fato. Ele resume o processo que seria feito assim:
OBS: o ??
é chamado de ternário. Caso tenha interesse ou não sabe o que é, vale a pena dar uma pesquisada.
Percebe que ainda sim precisamos passar um valor padrão pra caso a variável seja nil
, mesmo entrando na condição (algumNumero ?? 0
onde o 0 seria o valor padrão caso algumNumero
for nil
).
O IF Let faz exatamente esse processo de verificar se não é nil
E ainda cria uma variável pegando o valor do opcional ("tirando" o opcional da variável):
A condição só vai ser satisfeita quando a variável algumNumero
não for nil
e ainda salva o valor na variável numero
. Em outras palavras, a variável numero
só vai ser criada se algumNumero
não for nil
e vai ser atribuído o valor de algumNumero
, que de acordo com o exemplo acima o valor é 5
.
O print desse exemplo seria:
Existe um número ➞ 5
Vale ressaltar algumas coisas:
- A variável só vai ser criada, ou seja, só vai entrar na condição, se não for vazia (
nil
). Caso sejanil
, vai para o casoelse
(se existir) ou segue com o programa sem entrar no if:
- A variável criada é UNICAMENTE acessada dentro do if! Você não consegue acessar a variável fora do if, ela não existe fora da condição, apenas dentro (o que está dentro das chaves
{}
do if).
Esse é um dos pontos principais que difere do próximo tópico:
Guard Let
A estrutura do guard
é usada quando você quer assegurar (acredito que essa seja a tradução mais próxima) que algo exista. Aquilo precisa existir se não o programa encerra.
Vamos supor que você precisa que a variável numeroRecebido
não pode de forma alguma ser vazia (nil
), ela necessariamente precisa ser um inteiro (Int
). Nesse caso usamos o guard
A ideia é bem parecida com o IF Let. Você vai fazer a comparação pra ver se não é nil
e salvar em uma variável. O que difere é a condição else
, que basicamente vai ser o caso de "o que vai acontecer se for nil
", ou seja, quando o programa vai encerrar, já que não queremos que seja nil
.
Obs: nesse caso quando se comenta de programa pode ser tanto a função, classe, completionHandler.. Ou até mesmo o programa em si.
Como foi dito, o programa só vai continuar se a variável não for nula. Se for, ele vai entrar no else
.
Pontos a serem considerados:
- A variável
numero
criada não pode ser acessada dentro doelse
(exatamente o oposto do IF Let). Mas pode ser acessada logo em seguida (fora doelse
, no escopo em si)
Quando usar cada um
Ok, já entendi como funciona. Mas quando devo usar o opcional?
Se liga em alguns exemplos:
IF: Se você precisa fazer uma verificação mas não pretende usar a variável opcional (tanto ela no opcional ou o valor dela)
Um exemplo é quando você está lindando com erros. Quando uma função tem o completionHandler ela sempre retorna um erro (do tipo Error
):
Nesse exemplo eu estou apenas verificando se existe algum erro, mas (nesse caso) não me interessa qual. Mas se tiver um erro, a função não pode continuar.
OBS IMPORTANTE: tratem os erros, não ignore-os! S2
IF Let
O if let você usa quando precisa usar a variável opcional, mas só por um momento, que não precise usar em todo o escopo:
Ainda usando o mesmo exemplo:
Nesse exemplo eu quis imprimir o erro que aconteceu, ou seja, eu queria o valor da variável opcional, então salvei ela na variável algumErro
e DENTRO da condição (já que lá é o único lugar que eu posso acessar ela) eu printei (mostrei).
Guard Let
O guard let você usa quando NECESSARIAMENTE precisa do valor pra poder fazer alguma tarefa e, se ele não existir (for nil
) o processo não pode continuar:
Nesse exemplo vou mostrar usando o ciclo de vida do UIKit. Foi criado uma classe para a minha view (CustomView
) e vou definir ela na minha view controller:
Percebe que eu estou garantindo que a variável self.view
é do tipo CustomView
e, se não for, eu quero que a função encerre ali mesmo, já que não faz sentido continuar.
Boas Práticas
É uma boa prática em swift você criar a variável, que vai receber o valor do opcional caso não for nil
, com o mesmo nome da variável opcional (original):
Bônus: Guard (só o guard, sem o let)
O guard
no geral é usado pra ASSEGURAR de fato que algo precisa acontecer
Por exemplo: Quando um aplicativo de entrega não consegue entregar no endereço (CEP) da pessoa. Na hora que vai fazer a verificação, coloca um guard
pra ver se aquele endereço é possível fazer a entrega:
- Se for possível: configura a tela com os dados de entrega;
- Se não for possível: mostra um aviso de que não é possível;
Nesse exemplo, você está evitando de fazer cálculos e mudar a tela para visualizar o pedido, já que nem é possível entregar por que não entrega naquele CEP. Algo parecido com isso:
Outro exemplo é quando o app precisa de internet mas não tem uma comunicação: