Declaração de guarda rápida (com exemplos)

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, continueou throwno 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 trueou false).
  • Se a expressão for avaliada como false, as instruções dentro do bloco de código de guardsão executadas.
  • Se a expressão for avaliada como true, as instruções dentro do bloco de código de guardsã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, continueou 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, continueou throwdeclarações. Por enquanto vamos usar return. E como a returninstruçã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 returntermina 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-letpara desembrulhar um opcional. No entanto, também podemos usar a instrução guard em vez de if-letpara 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 returninstruçã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 = namedesembrulha um opcional que retorna trueem nosso caso e a segunda condição temp.count> 0verifica se a string desembrulhada tem mais de 0 caracteres que avaliam falseem 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 returninstrução.

Artigos interessantes...