Leggendo questo articolo ho notato grandi benefici usando Guard
Qui puoi confrontare l'uso di guard con un esempio:
Questa è la parte senza guardia:
func fooBinding(x: Int?) {
if let x = x where x > 0 {
// Do stuff with x
x.description
}
// Value requirements not met, do something
}
Qui stai inserendo il codice desiderato in tutte le condizioni
Potresti non vedere immediatamente un problema con questo, ma potresti immaginare quanto possa diventare confuso se fosse nidificato con numerose condizioni che tutti dovevano essere soddisfatte prima di eseguire le tue dichiarazioni
Il modo per ripulire è quello di fare prima ciascuno dei tuoi controlli e uscire se non sono stati soddisfatti. Ciò consente una facile comprensione di quali condizioni faranno uscire questa funzione.
Ma ora possiamo usare la guardia e possiamo vedere che è possibile risolvere alcuni problemi:
func fooGuard(x: Int?) {
guard let x = x where x > 0 else {
// Value requirements not met, do something
return
}
// Do stuff with x
x.description
}
- Verifica la condizione che desideri, non quella che non desideri. Anche questo è simile a un'affermazione. Se la condizione non viene soddisfatta, viene eseguita l'istruzione else di guard, che esce dalla funzione.
- Se la condizione passa, la variabile opzionale qui viene automaticamente scartata per te nell'ambito che è stata chiamata l'istruzione guard - in questo caso, la funzione fooGuard (_ :).
- Stai verificando in anticipo casi negativi, rendendo la tua funzione più leggibile e più facile da mantenere
Lo stesso modello vale anche per valori non opzionali:
func fooNonOptionalGood(x: Int) {
guard x > 0 else {
// Value requirements not met, do something
return
}
// Do stuff with x
}
func fooNonOptionalBad(x: Int) {
if x <= 0 {
// Value requirements not met, do something
return
}
// Do stuff with x
}
Se hai ancora domande, puoi leggere l'intero articolo: Swift guard statement.
Avvolgendo
E infine, leggendo e testando, ho scoperto che se usi guard per scartare qualsiasi opzione,
quei valori da scartare restano in giro per te da usare nel resto del tuo blocco di codice
.
guard let unwrappedName = userName else {
return
}
print("Your username is \(unwrappedName)")
Qui il valore da scartare sarebbe disponibile solo all'interno del blocco if
if let unwrappedName = userName {
print("Your username is \(unwrappedName)")
} else {
return
}
// this won't work – unwrappedName doesn't exist here!
print("Your username is \(unwrappedName)")