Dans cet article, vous apprendrez à utiliser l'instruction de garde pour contrôler le flux d'exécution de votre programme.
Swift If Statement décrit comment effectuer des actions en fonction de certaines conditions (valeur booléenne). Dans cet article, nous explorerons les avantages de l'instruction de garde par rapport à l'instruction if pour contrôler le flux du programme et écrire du code plus simple et plus propre.
Déclaration de Swift Guard
La principale utilisation de l'instruction de garde est de transférer le contrôle du programme hors d'une portée sous certaines conditions. Ces instructions sont similaires aux instructions if qui exécutent des instructions basées sur certaines conditions (valeur booléenne) mais contrairement à if, les instructions guard ne s'exécutent que lorsque certaines conditions ne sont pas remplies.
De plus, les déclarations à l'intérieur du garde doivent sortir de la portée. Par conséquent, nous devons les instructions de contrôle du programme utilisateur return
, break
, continue
ou throw
à la fin de l'instruction de garde.
Syntaxe de la déclaration de garde
expression de garde else (// instructions // doit contenir une instruction de contrôle: return, break, continue ou throw.)
- Ici, expression est une expression booléenne (renvoie soit
true
oufalse
). - Si l'expression est évaluée à
false
, les instructions à l'intérieur du bloc de code deguard
sont exécutées. - Si l'expression est évaluée à
true
, les instructions à l'intérieur du bloc de code deguard
sont ignorées de l'exécution.
Comment fonctionne la déclaration de garde?
Note: La fin de l'instruction de garde doit contenir une instruction de contrôle return
, break
, continue
ou throw
.
Exemple 1: Comment fonctionne la déclaration de garde?
Une simple déclaration de garde valide est la suivante:
guard true else ( print("Condition not met") ) print("Condition met")
Lorsque vous exécutez le programme, la sortie sera:
Condition remplie
Dans le programme ci-dessus, guard contient une valeur booléenne true (la condition est remplie). Puisque les instructions de garde ne s'exécutent que lorsque la condition n'est pas remplie, l'instruction à l'intérieur de la garde n'est pas exécutée. C'est pourquoi print("Condition met")
est exécuté et affiche la condition remplie à l'écran.
Maintenant, changeons la condition en false comme:
Exemple 2: l'instruction de garde doit quitter la portée
guard false else ( print("Condition not met") ) print("Condition met")
Dans le programme ci-dessus, la condition de garde est évaluée à false
. Ainsi, l'instruction à l' print("Condition not met")
intérieur de else devrait s'exécuter. Mais vous obtiendrez une erreur indiquant que le corps «guard» ne peut pas tomber, pensez à utiliser un «return» ou «throw» pour quitter la portée.
Le message d'erreur dans un langage simple mot signifie, vous devez transférer le contrôle du programme de la déclaration de garde en utilisant return
, break
, continue
ou des throw
déclarations. Pour l'instant, nous allons utiliser return
. Et comme l' return
instruction ne peut être utilisée qu'à l'intérieur d'une fonction, nous allons envelopper le code ci-dessus dans Swift Functions.
Exemple 3: déclaration de garde à l'intérieur d'une fonction
Nous pouvons utiliser l'instruction de garde à l'intérieur d'une fonction dans Swift comme:
func someFunction() ( guard false else ( print("Condition not met") return ) print("Condition met") ) someFunction() print("Hello after function call")
Lorsque vous exécutez le programme ci-dessus, la sortie sera:
Condition non remplie Bonjour après l'appel de fonction
Dans le programme ci-dessus, la condition de garde est évaluée false
, donc les instructions à l'intérieur de la garde s'exécutent. La première instruction print("Condition not met")
renvoie une condition non remplie dans la console.
Et l'instruction return
met fin à l'exécution d'une fonction et de l'instruction print("Hello, after function call")
après l'exécution de l'appel de fonction qui génère Hello après l'appel de fonction dans la console.
Exemple 4: Garde avec options
Nous avons vu dans Swift Optionals l'utilisation de if-let
pour dérouler une option. Cependant, nous pouvons également utiliser une déclaration de garde à la place de if-let
pour déballer une option avec un avantage. Le principal avantage de déballer une option avec garde au lieu de if-let
est que nous pouvons augmenter la portée de la variable non emballée.
Voyons cela dans l'exemple ci-dessous:
func changeOptionalStringToUpperCase() ( var name:String? guard let temp = name else ( print("Name is nil. Cannot process") return ) print("Uppercased:(temp.uppercased())") ) changeOptionalStringToUpperCase()
Lorsque vous exécutez le programme ci-dessus, la sortie sera:
Le nom est nul. Impossible de traiter
Dans le programme ci-dessus, vous pouvez voir que la valeur non emballée temp est utilisée en dehors de la portée définie par l'instruction de garde. Puisque, nom est défini facultatif et contient une valeur nulle, l'instruction de garde ne parvient pas à déballer la valeur.
Ainsi, les instructions à l'intérieur de guard else exécutent ce qui affiche Name est nul. Impossible de traiter dans la sortie et met fin à la fonction avec une return
instruction. Le code équivalent de l'instruction de garde ci-dessus if-else est:
func changeOptionalStringToUpperCase() ( var name:String? if let temp = name ( print("Uppercased:(temp.uppercased())") ) else ( print("Name is nil. Cannot process") return ) //how to access temp here?? Solution:Use Guard ) changeOptionalStringToUpperCase()
Remarquez ci-dessus que deux déclarations sont toutes deux valides et font le même travail. Mais en utilisant l'instruction if-let, vous ne pouvez pas utiliser la valeur non encapsulée en dehors de l'instruction if-let. Mais avec l'instruction de garde, vous pouvez utiliser la valeur non emballée tout au long de la fonction.
Exemple 5: Garde avec plusieurs conditions
Les instructions de garde peuvent également enchaîner plusieurs conditions séparées par une virgule (,) comme suit:
func changeOptionalStringToUpperCase() ( var name:String? = "" guard let temp = name , temp.count> 0 else ( print("Name is nil or an empty string. Cannot process") return ) print("Uppercased:(temp.uppercased())") ) changeOptionalStringToUpperCase()
Lorsque vous exécutez le programme ci-dessus, la sortie sera:
Le nom est nul ou une chaîne vide. Impossible de traiter
Dans le programme ci-dessus, l'instruction de garde contient deux conditions séparées par une virgule.
La première condition let temp = name
déballe une option qui retourne true
dans notre cas et la seconde condition temp.count> 0
vérifie si la chaîne déballée contient plus de 0 caractères, ce qui correspond à false
dans notre exemple.
Par conséquent, l'instruction à l'intérieur de l'instruction de garde exécute l'instruction print("Name is nil or an empty string. Cannot process")
dont le nom est nul ou une chaîne vide. Impossible de traiter dans la console et met fin à la fonction avec une return
instruction.