Neste artigo, você aprenderá a usar a instrução guard para controlar o fluxo de execução do seu programa.
A declaração If Swift descreve como você pode executar ações com base em certas condições (valor booleano). Neste artigo, exploraremos os benefícios da instrução guard sobre a instrução if para controlar o fluxo do programa e escrever um código mais simples e limpo.
Declaração de guarda rápida
O principal uso da instrução guard é transferir o controle do programa para fora de um escopo em certas condições. Essas instruções são semelhantes às instruções if, que executam instruções baseadas em certas condições (valor booleano), mas ao contrário de if, as instruções guard são executadas apenas quando certas condições não são atendidas.
Além disso, as declarações dentro da guarda devem sair do escopo. Portanto, temos que declarações de controle do programa de usuário return
, break
, continue
ou throw
no final da instrução de guarda.
Sintaxe da declaração de proteção
expressão de guarda else (// instruções // deve conter uma instrução de controle: retornar, interromper, continuar ou lançar.)
- Aqui, expressão é uma expressão booleana (retorna
true
oufalse
). - Se a expressão for avaliada como
false
, as instruções dentro do bloco de código deguard
são executadas. - Se a expressão for avaliada como
true
, as instruções dentro do bloco de código deguard
são ignoradas na execução.
Como funciona a instrução de guarda?
Nota: O fim da instrução de guarda deve conter uma instrução de controle return
, break
, continue
ou throw
.
Exemplo 1: Como funciona a instrução de guarda?
Uma declaração de guarda válida simples é a seguinte:
guard true else ( print("Condition not met") ) print("Condition met")
Quando você executa o programa, a saída será:
Condição atendida
No programa acima, guard contém um valor booleano verdadeiro (a condição foi atendida). Como as instruções de guarda só são executadas quando a condição não é atendida, a instrução dentro da guarda não é executada. É por isso que print("Condition met")
é executado e exibe a condição encontrada na tela.
Agora vamos mudar a condição para falsa como:
Exemplo 2: a instrução de guarda deve sair do escopo
guard false else ( print("Condition not met") ) print("Condition met")
No programa acima, a condição de guarda é avaliada como false
. Portanto, a instrução print("Condition not met")
dentro do else deve ser executada. Mas você obterá um erro dizendo que o corpo de 'guarda' pode não cair, considere usar um 'retorno' ou 'lançamento' para sair do escopo.
A mensagem de erro na palavra significa simples, você precisa transferir o controle do programa a partir da declaração de guarda usando return
, break
, continue
ou throw
declarações. Por enquanto vamos usar return
. E como a return
instrução só pode ser usada dentro de uma função, vamos envolver o código acima em Funções Swift.
Exemplo 3: instrução de guarda dentro de uma função
Podemos usar a instrução guard dentro de uma função no Swift como:
func someFunction() ( guard false else ( print("Condition not met") return ) print("Condition met") ) someFunction() print("Hello after function call")
Quando você executa o programa acima, a saída será:
Condição não atendida Olá após chamada de função
No programa acima, a condição de guarda é avaliada como false
, portanto, as instruções dentro da guarda são executadas. A primeira instrução print("Condition not met")
emite Condição não encontrada no console.
E a instrução return
termina a execução de uma função e a instrução print("Hello, after function call")
após a chamada da função é executada, o que gera um Hello após a chamada da função no console.
Exemplo 4: Proteção com opcionais
Vimos em Swift Optionals o uso de if-let
para desembrulhar um opcional. No entanto, também podemos usar a instrução guard em vez de if-let
para desembrulhar um opcional com uma vantagem. A principal vantagem de desembrulhar um opcional com guarda em vez de if-let
é que podemos aumentar o escopo da variável desembrulhada.
Vamos ver no exemplo abaixo:
func changeOptionalStringToUpperCase() ( var name:String? guard let temp = name else ( print("Name is nil. Cannot process") return ) print("Uppercased:(temp.uppercased())") ) changeOptionalStringToUpperCase()
Quando você executa o programa acima, a saída será:
O nome é nulo. Não pode processar
No programa acima, você pode ver que o valor não embalado temp está sendo usado fora do escopo definido pela instrução guard. Como o nome é definido opcionalmente e contém valor nulo, a instrução guard falha em desembrulhar o valor.
Assim, as instruções dentro da guarda else executam, o que imprime o nome é nulo. Não pode processar na saída e termina a função com return
instrução. O código equivalente da instrução de guarda acima da instrução if-else é:
func changeOptionalStringToUpperCase() ( var name:String? if let temp = name ( print("Uppercased:(temp.uppercased())") ) else ( print("Name is nil. Cannot process") return ) //how to access temp here?? Solution:Use Guard ) changeOptionalStringToUpperCase()
Observe que as duas instruções acima são válidas e fazem o mesmo trabalho. Mas usando a instrução if-let, você não pode usar o valor não embalado fora da instrução if-let. Mas com a instrução guard, você pode usar o valor não empacotado em toda a função.
Exemplo 5: proteção com várias condições
As instruções de proteção também podem encadear várias condições separadas por vírgula (,) como:
func changeOptionalStringToUpperCase() ( var name:String? = "" guard let temp = name , temp.count> 0 else ( print("Name is nil or an empty string. Cannot process") return ) print("Uppercased:(temp.uppercased())") ) changeOptionalStringToUpperCase()
Quando você executa o programa acima, a saída será:
O nome é nulo ou uma string vazia. Não pode processar
No programa acima, a instrução guard contém duas condições separadas por vírgula.
A primeira condição let temp = name
desembrulha um opcional que retorna true
em nosso caso e a segunda condição temp.count> 0
verifica se a string desembrulhada tem mais de 0 caracteres que avaliam false
em nosso exemplo.
Portanto, a instrução dentro da instrução guard executa a instrução print("Name is nil or an empty string. Cannot process")
que mostra que Nome é nulo ou uma string vazia. Não é possível processar no console e termina a função com return
instrução.