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.
func submit() {
guard let name = nameField.text else {
show("No name to submit")
return
}
guard let address = addressField.text else {
show("No address to submit")
return
}
guard let phone = phoneField.text else {
show("No phone to submit")
return
}
sendToServer(name, address: address, phone: phone)
}
func sendToServer(name: String, address: String, phone: String) {
...
}
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.
func nonguardSubmit() {
if let name = nameField.text {
if let address = addressField.text {
if let phone = phoneField.text {
sendToServer(name, address: address, phone: phone)
} else {
show("no phone to submit")
}
} else {
show("no address to submit")
}
} else {
show("no name to submit")
}
}
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/