O Swift 2 introduziu a guard
palavra - chave, que pode ser usada para garantir que vários dados estejam configurados prontos para serem usados. Um exemplo que vi neste site demonstra uma função submitTapped:
func submitTapped() {
guard username.text.characters.count > 0 else {
return
}
print("All good")
}
Gostaria de saber se o uso guard
é diferente de fazê-lo da maneira antiga, usando uma if
condição. Oferece benefícios que você não poderia obter usando uma verificação simples?
swift2
guard-statement
David Snabel
fonte
fonte
Respostas:
Ao ler este artigo , notei grandes benefícios usando o Guard
Aqui você pode comparar o uso de guarda com um exemplo:
Esta é a parte sem guarda:
Aqui você está colocando o código desejado em todas as condições
Você pode não encontrar imediatamente um problema com isso, mas pode imaginar o quão confuso isso poderia se tornar se estivesse aninhado com várias condições que todos precisavam ser atendidas antes de executar suas instruções
A maneira de limpar isso é fazer cada uma das suas verificações primeiro e sair se alguma não for atendida. Isso permite uma fácil compreensão de quais condições farão com que essa função saia.
Mas agora podemos usar a proteção e podemos ver que é possível resolver alguns problemas:
Esse mesmo padrão também é válido para valores não opcionais:
Se você ainda tiver alguma dúvida, pode ler o artigo inteiro: Declaração de guarda rápida.
Empacotando
E, finalmente, lendo e testando, descobri que, se você usar o protetor para desembrulhar quaisquer opcionais,
.
Aqui, o valor desembrulhado estaria disponível apenas dentro do bloco if
fonte
let x = x where x > 0
significa que você acoplou outra condição à sua ligação opcional? Quero dizer, é um pouco diferente deif let constantName = someOptional { statements }
Ao contrário
if
,guard
cria a variável que pode ser acessada de fora do seu bloco. É útil desembrulhar muitosOptional
s.fonte
Há realmente dois grandes benefícios para
guard
. Um deles é evitar a pirâmide da destruição, como outros já mencionaram - muitasif let
declarações irritantes aninhadas umas nas outras, movendo-se cada vez mais para a direita.O outro benefício é geralmente a lógica que você deseja implementar é mais "
if not let
" do que "if let { } else
".Aqui está um exemplo: suponha que você queira implementar
accumulate
- um cruzamento entremap
ereduce
onde ele devolve uma série de reduções de execução . Aqui está comguard
:Como você o escreveria sem guarda, mas ainda usando
first
isso retorna um opcional? Algo assim:O aninhamento extra é irritante, mas também não é lógico separar o
if
e oelse
distante. É muito mais legível ter a saída antecipada para o caso vazio e continuar com o restante da função como se isso não fosse uma possibilidade.fonte
Quando uma condição é atendida,
guard
ela expõe as variáveis declaradas noguard
bloco ao restante do bloco de código, trazendo-as para seu escopo. O que, como afirmado anteriormente, certamente será útil nasif let
instruções aninhadas .Observe que o guarda requer um retorno ou um lançamento na sua declaração else.
Analisando JSON com o Guard
Abaixo está um exemplo de como alguém pode analisar um objeto JSON usando guard em vez de if-let. Este é um trecho de uma entrada de blog que inclui um arquivo de playground que você pode encontrar aqui:
Como usar o Guard no Swift 2 para analisar JSON
baixar playground: guarda playground
Mais informações:
Aqui está um trecho do The Swift Programming Language Guide:
fonte
Um benefício é a eliminação de muitas
if let
instruções aninhadas . Veja o vídeo "What's New in Swift" da WWDC por volta das 15:30, na seção intitulada "Pirâmide da Perdição".fonte
Quando usar guardas
Se você possui um controlador de exibição com alguns elementos UITextField ou algum outro tipo de entrada do usuário, notará imediatamente que deve desembrulhar o opcional textField.text para obter o texto interno (se houver!). isEmpty não fará nenhum bem a você, sem nenhuma entrada, o campo de texto simplesmente retornará nulo.
Portanto, você tem alguns desses que você desembrulha e, eventualmente, passa para uma função que os publica no terminal do servidor. Não queremos que o código do servidor tenha que lidar com valores nulos ou enviar valores inválidos por engano para o servidor, portanto, desembrulharemos esses valores de entrada primeiro.
Você notará que nossa função de comunicação com o servidor usa valores não opcionais de String como parâmetros, portanto, a proteção é desembrulhada com antecedência. O desembrulhar é um pouco pouco intuitivo, porque estamos acostumados a desembrulhar com if deixe quais desembrulham valores para uso dentro de um bloco. Aqui, a declaração de guarda tem um bloco associado, mas na verdade é outro bloco - ou seja, o que você faz se o desembrulhar falhar - os valores são desembrulhados diretamente no mesmo contexto que a própria declaração.
// separação de preocupações
Sem guarda
Sem o uso de guarda, acabaríamos com uma grande pilha de código que se assemelha a uma pirâmide de destruição . Isso não é adequado para adicionar novos campos ao nosso formulário ou criar código muito legível. Pode ser difícil seguir o recuo, particularmente com tantas outras declarações em cada bifurcação.
Sim, podemos até combinar todas essas instruções if let em uma única instrução separada por vírgulas, mas perderíamos a capacidade de descobrir qual instrução falhou e apresentar uma mensagem ao usuário.
https://thatthinginswift.com/guard-statement-swift/
fonte
Com o uso da guarda, nossa intenção é clara. não queremos executar o restante do código se essa condição específica não for atendida. aqui também podemos estender a cadeia, dê uma olhada no código abaixo:
fonte
Declaração de guarda vai fazer. é par de diferente
1) é permitido reduzir a declaração aninhada
2) é aumentar meu escopo que minha variável acessível
Declaração if
Declaração de guarda
fonte
Declaração de guarda
Uma declaração de guarda é usada para transferir o controle do programa fora de um escopo se uma ou mais condições não forem atendidas.
Synatx:
Vantagem:
1. Usando a
guard
instrução, podemos nos livrar de condicionais profundamente aninhados, cujo único objetivo é validar um conjunto de requisitos.2. Ele foi projetado especificamente para sair antecipadamente de um método ou função.
se você usar se deixe abaixo é o código que parece.
Usando o protetor, você pode transferir o controle de um escopo se uma ou mais condições não forem atendidas.
Referência:
1. Swift 2: saia cedo com guarda 2. Udacity 3. Declaração de guarda
fonte
if condition { return }
grosseiro?Como uma instrução if, o guard executa instruções com base no valor booleano de uma expressão. Ao contrário de uma instrução if, as instruções de guarda são executadas apenas se as condições não forem atendidas. Você pode pensar em proteger mais como um Assert, mas em vez de travar, você pode sair normalmente.
consulte: http://ericcerney.com/swift-guard-statement/
fonte
Realmente torna o fluxo de uma sequência com várias pesquisas e opcionais muito mais conciso e claro e reduz muito o aninhamento. Veja a publicação de Erica Sadun sobre a substituição de Ifs . .... Poderia se deixar levar, um exemplo abaixo:
Veja se isso gruda.
fonte
Simplificando, ele fornece uma maneira de validar campos antes da execução. Este é um bom estilo de programação, pois melhora a legibilidade. Em outros idiomas, pode ser assim:
Mas como o Swift fornece opcionais, não podemos verificar se é nulo e atribuir seu valor a uma variável. Por outro lado,
if let
verifica se não é nulo e atribui uma variável para armazenar o valor real. É aqui queguard
entra em jogo. Ele fornece uma maneira mais concisa de sair mais cedo usando os opcionais.fonte
Fonte: Guarda em Swift
Vamos ver o exemplo para entender claramente
Exemplo 1:
No exemplo acima, vemos que 3 é maior que 2 e a instrução dentro da cláusula guard else é ignorada e True é impresso.
Exemplo 2:
No exemplo acima, vemos que 1 é menor que 2 e a instrução dentro da cláusula guard else é executada e False é impresso seguido de retorno.
No exemplo acima, estamos usando o guard let para desembrulhar os opcionais. Na função getName, definimos uma variável do tipo string myName, que é opcional. Em seguida, usamos guard let para verificar se a variável myName é nula ou não, se não atribuir ao nome e verificar novamente, o nome não está vazio. Se ambas as condições forem qualificadas, ou seja, verdadeiras, o bloco else será ignorado e imprimirá “Condições são atendidas com o nome”.
Basicamente, estamos verificando duas coisas aqui separadas por vírgula, primeiro desembrulhando e opcional e verificando se isso satisfaz ou não a condição.
Aqui não estamos passando nada para a função, ou seja, string vazia e, portanto, Condition is false é print.
Aqui estamos passando “Hello” para a função e você pode ver a saída impressa “Condition is met Hello Hello”.
fonte