Wann man Wachen benutzt
Wenn Sie einen Ansichts-Controller mit einigen UITextField-Elementen oder einer anderen Art von Benutzereingabe haben, werden Sie sofort feststellen, dass Sie die optionale Datei textField.text auspacken müssen, um zum darin enthaltenen Text zu gelangen (falls vorhanden!). isEmpty bringt Ihnen hier nichts, ohne Eingabe gibt das Textfeld einfach null zurück.
Sie haben also einige davon, die Sie auspacken und schließlich an eine Funktion übergeben, die sie an einen Serverendpunkt sendet. Wir möchten nicht, dass der Servercode mit Nullwerten umgehen oder versehentlich ungültige Werte an den Server senden muss, damit wir diese Eingabewerte zuerst mit Guard auspacken.
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) {
...
}
Sie werden feststellen, dass unsere Serverkommunikationsfunktion nicht optionale String-Werte als Parameter verwendet, daher wird der Guard zuvor ausgepackt. Das Auspacken ist etwas unintuitiv, da wir es gewohnt sind, mit if let auszupacken, wodurch Werte für die Verwendung innerhalb eines Blocks ausgepackt werden. Hier ist der Guard-Anweisung ein Block zugeordnet, aber es handelt sich tatsächlich um einen else-Block. Wenn Sie also das Entpacken fehlschlagen, werden die Werte direkt in den gleichen Kontext wie die Anweisung selbst entpackt.
// Trennung von Bedenken
Ohne Wache
Ohne Schutz würden wir einen großen Haufen Code erhalten, der a ähnelt Pyramide des Untergangs . Dies lässt sich nicht gut skalieren, um unserem Formular neue Felder hinzuzufügen oder um gut lesbaren Code zu erhalten. Einrückungen können schwierig zu befolgen sein, insbesondere bei so vielen anderen Aussagen an jeder Gabelung.
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")
}
}
Ja, wir könnten all diese sogar kombinieren, wenn Anweisungen in eine einzige Anweisung durch Kommas getrennt werden, aber wir würden die Fähigkeit verlieren, herauszufinden, welche Anweisung fehlgeschlagen ist, und dem Benutzer eine Nachricht präsentieren.
https://thatthinginswift.com/guard-statement-swift/