Eu tenho lido sobre os Opcionais no Swift e vi exemplos de onde if let
é usado para verificar se um Opcional possui um valor e, no caso, ele faz - faça algo com o valor desembrulhado.
No entanto, vi que no Swift 2.0 a palavra guard let
- chave é usada principalmente. Gostaria de saber se if let
foi removido do Swift 2.0 ou se ainda é possível usá-lo.
Devo alterar meus programas que contêm if let
para guard let
?
fonte
if let
quando onon-nil
caso for válido. Useguard
quando onil
caso representa algum tipo de erro.guard
é apropriado, mesmo que não haja erro. Às vezes, significa apenas que não há nada a fazer. Por exemplo, umpositionTitle
método podeguard if let title = title else {return}
. O título pode ser opcional. Nesse caso, isso não é um erro. Masguard let
ainda é apropriado.if let
é visível apenas dentro doif let
escopo. A variável vinculada porguard let
é visível posteriormente. Portanto, faz sentido usar guarda para vincular valores opcionais também.Guarda pode melhorar a clareza
Quando você usa o guarda, você tem uma expectativa muito maior de que o guarda seja bem - sucedido e é um pouco importante que, se não for bem-sucedido, você queira sair do escopo mais cedo . Como você guarda para ver se existe um arquivo / imagem, se uma matriz é Vazia ou não.
Se você escrever o código acima com if-let, ele transmite ao desenvolvedor de leitura que é mais do que 50-50. Mas se você usa o guarda, adiciona clareza ao seu código e isso implica que eu espero que funcione 95% das vezes ... se alguma vez falhou, não sei por que; é muito improvável ... mas use essa imagem padrão ou apenas afirme com uma mensagem significativa descrevendo o que deu errado!
Além disso, como resultado das sugestões acima e do código limpo, é mais provável que você queira / precise adicionar asserções a declarações de guarda com falha , isso apenas melhora a legibilidade e deixa claro para outros desenvolvedores o que você estava esperando.
(você não usará declarações / condições prévias para
if-let
s. Simplesmente não parece certo)Usar guardas também ajuda a melhorar a clareza, evitando a pirâmide da desgraça. Veja a resposta de Nitin .
Guard cria uma nova variável
Há uma diferença importante que acredito que ninguém explicou bem.
Ambos
guard let
eif let
desembrulhar a variável no entantoCom
guard let
você, você está criando uma nova variável que existirá fora daelse
instrução.Como
if let
você não está criando nenhuma nova variável - após a instrução else, você só insere o bloco de código se o opcional for nulo. A variável recém-criada existe apenas dentro do bloco de código não depois!guard let:
if-let:
Para obter mais informações
if let
, consulte: Por que a redeclaração da ligação opcional não cria um erro?Guarda requer escopo saindo
(Também mencionado na resposta de Rob Napier):
Você DEVE ter
guard
definido dentro de uma função. Seu principal objetivo é abortar / retornar / sair do escopo, se uma condição não for atendida:Para
if let
você não precisa tê-lo em nenhuma função:guard
vsif
Pena de notar que é mais apropriado para ver esta questão como
guard let
vsif let
eguard
vsif
.Um autônomo
if
não desembrulha, nem um autônomoguard
. Veja o exemplo abaixo. Não sai mais cedo se um valor énil
. Não há valores opcionais. Ele sai cedo se uma condição não for atendida.fonte
Quando usar
if-let
e quando usarguard
geralmente é uma questão de estilo.Digamos que você tenha
func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int
uma matriz opcional de itens (var optionalArray: [SomeType]?
) e precise retornar0
se a matriz estivernil
(não definida) oucount
se a matriz tiver um valor (definido).Você pode implementá-lo assim usando
if-let
:ou assim usando
guard
:Os exemplos são funcionalmente idênticos.
Onde
guard
realmente brilha é quando você tem uma tarefa como validar dados e deseja que a função falhe mais cedo se algo estiver errado.Em vez de aninhar um monte de
if-let
s à medida que você se aproxima da conclusão da validação, o "caminho de sucesso" e os opcionais agora vinculados com êxito estão todos no escopo principal do método, porque todos os caminhos de falha já retornaram.fonte
Vou tentar explicar a utilidade das declarações de guarda com algum código (não otimizado).
Você tem uma interface do usuário na qual está validando campos de texto para registro do usuário com nome, sobrenome, email, telefone e senha.
Se algum textField não contiver texto válido, esse campo deve ser firstResponder.
aqui está o código não otimizado:
Você pode ver acima, que todas as strings (firstNameString, lastNameString etc) estão acessíveis apenas dentro do escopo da instrução if. portanto, cria essa "pirâmide da desgraça" e tem muitos problemas, incluindo legibilidade e facilidade de mudar as coisas (se a ordem dos campos for alterada, você precisará reescrever a maior parte desse código)
Com a declaração de guarda (no código abaixo), você pode ver que essas cadeias estão disponíveis fora
{}
e são usadas, se todos os campos forem válidos.Se a ordem dos campos mudar, basta mover as respectivas linhas de código para cima ou para baixo, e você estará pronto.
Esta é uma explicação muito simples e um caso de uso. Espero que isto ajude!
fonte
Diferença básica
Guarda deixe
se deixar
NOTA: Ambos são usados para desembrulhar a variável Opcional.
fonte
A explicação mais clara que vi foi no Guia de Estilo do Github Swift :
if
adiciona um nível de profundidade:guard
não:fonte
guarda
Uma declaração de guarda tem o seguinte formato:
se deixar
fonte
Aprendi isso rapidamente com Bob ..
Caso contrário típico
Problemas com Else-If
Declaração de guarda Um bloco de proteção é executado apenas se a condição for falsa e sairá da função através do retorno. Se a condição for verdadeira, Swift ignorará o bloco de proteção. Ele fornece uma saída antecipada e menos colchetes.
Desempacotar Opcionais com Else-If
Uma declaração de guarda não é apenas útil para substituir um bloco condicional típico por uma outra declaração if, mas também é excelente para desembrulhar opcionais, minimizando o número de colchetes. Para comparar, vamos começar como desembrulhar vários opcionais com else-if. Primeiro, vamos criar três opcionais que serão desembrulhados.
O Pior Pesadelo
O código acima certamente funciona, mas viola o princípio DRY. É atroz. Vamos detalhar. +
Um pouco melhor O código abaixo é mais legível que o anterior.
Desembrulhar com proteção As instruções else-if podem ser substituídas por proteção.
Desembrulhe vários opcionais com o Else-If Até agora, você desembrulhou os opcionais um por um. Swift nos permite desembrulhar vários opcionais de uma só vez. Se um deles contiver nulo, ele executará o bloco else.
Desembrulhe várias opções opcionais com o Guard É claro que devemos usar o guard over else-if.
fonte