En lisant cet article, j'ai remarqué de grands avantages en utilisant Guard
Ici, vous pouvez comparer l'utilisation de la garde avec un exemple:
C'est la partie sans garde:
func fooBinding(x: Int?) {
if let x = x where x > 0 {
// Do stuff with x
x.description
}
// Value requirements not met, do something
}
Ici, vous mettez votre code souhaité dans toutes les conditions
Vous ne verrez peut-être pas immédiatement un problème avec cela, mais vous pourriez imaginer à quel point cela pourrait devenir confus s'il était imbriqué avec de nombreuses conditions qui devaient toutes être remplies avant d'exécuter vos instructions
La façon de nettoyer cela est de faire d'abord chacun de vos contrôles et de quitter si aucun n'est respecté. Cela permet de comprendre facilement quelles conditions feront quitter cette fonction.
Mais maintenant, nous pouvons utiliser la garde et nous pouvons voir qu'il est possible de résoudre certains problèmes:
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
}
- Vérifier l'état que vous voulez, pas celui que vous ne voulez pas. Ceci est à nouveau similaire à une assertion. Si la condition n'est pas remplie, l'instruction else de guard est exécutée, ce qui sort de la fonction.
- Si la condition réussit, la variable facultative ici est automatiquement dépliée pour vous dans la portée que l'instruction de garde a été appelée - dans ce cas, la fonction fooGuard (_ :).
- Vous recherchez les mauvais cas tôt, ce qui rend votre fonction plus lisible et plus facile à maintenir
Ce même modèle s'applique également aux valeurs non facultatives:
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
}
Si vous avez encore des questions, vous pouvez lire l'intégralité de l'article: Déclaration de Swift Guard.
Emballer
Et enfin, en lisant et en testant, j'ai trouvé que si vous utilisez guard pour déballer les options,
ces valeurs non enveloppées restent pour que vous puissiez les utiliser dans le reste de votre bloc de code
.
guard let unwrappedName = userName else {
return
}
print("Your username is \(unwrappedName)")
Ici, la valeur déballée ne serait disponible qu'à l'intérieur du bloc 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)")