English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Instruction guard Swift

Dans cet article, vous apprendrez à utiliser l'instruction de garde pour contrôler le flux d'exécution du programme.

Instructions If SwiftCela décrit comment exécuter des opérations basées sur des conditions spécifiques (valeur booléenne). Dans cet article, nous allons apprendre les avantages de l'instruction de garde par rapport à l'instruction if pour contrôler le flux du programme et écrire un code plus simple et plus propre.

Instruction guard Swift

L'utilisation principale de l'instruction de garde est de transférer le contrôle du programme vers une plage externe sous certaines conditions. Ces instructions sont similaires aux instructions if basées sur des conditions spécifiques (valeur booléenne), mais contrairement à l'instruction if, l'instruction de garde ne s'exécute que lorsque certaines conditions ne sont pas satisfaites.

De plus, l'instruction de garde doit sortir du domaine. Par conséquent, nous devons utiliser une instruction de contrôle de programme utilisateur (return, break, continue ou throw) à la fin de l'instruction de garde.

Syntaxe de l'instruction de garde

expression de garde else {
	//Instruction
	//Il doit contenir une instruction de contrôle : return, break, continue ou throw.
{}
  • Ici, l'expression est une expression booléenne (retourne true ou false).

  • Si la valeur de l'expression est calculée à false, les instructions dans le bloc de code de la directive guard sont exécutées.

  • Si la valeur de l'expression est calculée à true, la directive guard dans le bloc de code est sautée lors de l'exécution.

La directive guard fonctionne-t-elle ?

Note : la directive guard doit se terminer par une instruction de contrôle return, break, continue ou throw.

Exemple1:la directive guard fonctionne-t-elle ?

Une directive guard valide simple est la suivante :

guard true else {
	print("条件不满足")
{}
print("满足条件")

Lors de l'exécution du programme, la sortie est :

满足条件

Dans le programme mentionné ci-dessus, guard contient une valeur booléenne true (satisfait la condition). Comme la directive guard ne s'exécute que lorsque la condition n'est pas remplie, les instructions à l'intérieur de guard ne sont pas exécutées. C'est pourquoi l'exécution de print("满足条件") et l'affichage sur l'écran.满足条件pour la raison.

Maintenant, changez la condition en false :

Exemple2:la directive guard doit quitter la portée

guard false else {
	print("条件不满足")
{}
print("满足条件")

Dans le programme mentionné ci-dessus, le résultat du calcul de la condition de protection est false. Par conséquent, il devrait exécuter l'instruction print("Condition not met") dans else. Cependant, vous recevrez un message d'erreur:Le corps de la directive 'guard' ne peut pas tomber à travers, envisagez d'utiliser 'return' ou 'throw' pour sortir de la portée.

Le message d'erreur signifie que vous devez utiliser des instructions return, break, continue ou throw pour transférer le contrôle du programme à partir de la directive guard. Maintenant, nous allons utiliser return. Comme l'instruction return ne peut être utilisée qu'à l'intérieur d'une fonction, nous allons envelopper le code ci-dessus dans une fonction Swift.

Exemple3:directive guard dans le corps de la fonction

Nous pouvons utiliser la directive guard en Swiftdans la fonctionL'utilisation de la directive guard, comme suit :

func someFunction() {
	guard false else {
		print("条件不满足")
		return
	{}
	print("满足条件")
{}
someFunction()
print("函数调用后输出 Hello")

Lorsque vous exécutez le programme ci-dessus, la sortie sera :

条件不满足
Hello est affiché après l'appel de la fonction.

Dans le programme mentionné ci-dessus, le résultat du calcul de la condition guard est false, donc l'exécution des instructions à l'intérieur de guard. La première instruction print("条件不满足") est affichée dans la console.:condition non remplie.

Et l'instruction return termine l'exécution de la fonction, tandis que l'instruction print("Hello, après appel de la fonction") affiche les instructions après l'appel de la fonction dans la console :Appel de la fonction après affichage Hello.

Exemple4:guard avec des optionnels

Nous sommes dansDans Swift OptionalsNous avons déjà vu l'utilisation de if-Déballer un Optional avec let. Mais nous pouvons également utiliser des instructions guard au lieu de if-L'expansion de l'instruction optionnelle avec let a un avantage. Utiliser guard plutôt que if-L'un des principaux avantages de l'expansion des variables optionnelles avec let est que nous pouvons augmenter la portée de déballage de la variable.

Voyons cela dans l'exemple suivant :

func changeOptionalStringToUpperCase() {
	var name: String?
	guard let temp = name else {
		print("Le nom est nil. Impossible de traiter")
		return
	{}
	print("Majuscule:\(temp.uppercased())")
{}
changeOptionalStringToUpperCase()

Lorsque vous exécutez le programme ci-dessus, la sortie sera :

Le nom est nil. Impossible de traiter

Dans le programme ci-dessus, vous pouvez voir que la valeur non enveloppée temp est utilisée en dehors de la portée définie par l'instruction guard. En raison de la définition de name comme optionnel et contenant une valeur nil, l'instruction guard ne peut pas déballer cette valeur.

Par conséquent, dans le guard else, les instructions affichent Le nom est nil. Impossible de traiter et se terminent par une instruction return pour arrêter la fonction. Le code équivalent des instructions guard if else est :

func changeOptionalStringToUpperCase() {
    
	var name: String?
	if let temp = name {
		print("Majuscule:\(temp.uppercased())")
	}
		print("Le nom est nil. Impossible de traiter")
		return
    {}
	//Comment y accéder ici ? Solution : utiliser Guard
{}
changeOptionalStringToUpperCase()

Attention, les deux instructions ci-dessus sont valides et accomplissent la même tâche. Cependant, utiliser if-Ne pas utiliser if après let-Utilisation de valeurs non enveloppées (unwrapped) en dehors des instructions let. Cependant, avec les instructions guard, vous pouvez utiliser des valeurs non enveloppées dans une fonction.

Instance5:条件多的guard

Les instructions guard peuvent également relier plusieurs conditions, séparées par des virgules (,), comme ci-dessous :

func changeOptionalStringToUpperCase() {
	var name: String? = ""
	guard let temp = name, temp.count > 0 else {
		print("Le nom est nil ou une chaîne vide. Impossible de traiter")
		return
	{}
	print("Uppercased:\(temp.uppercased())")
{}
changeOptionalStringToUpperCase()

Lorsque vous exécutez le programme ci-dessus, la sortie sera :

Le nom est nil ou une chaîne vide. Il n'est pas possible de traiter

Dans le programme ci-dessus, la clause guard contient deux conditions, séparées par une virgule.

La première condition let temp = name déverrouille un paramètre optionnel, dans notre exemple, cette condition retourne true, la deuxième condition temp.count > 0 vérifie si la chaîne dépaquetée contient plus de 0 caractères, dans notre exemple, le résultat est false.

Par conséquent, l'instruction dans la clause guard exécute l'instruction  print("Le nom est nil ou une chaîne vide. Il n'est pas possible de traiter.") ,sa sortie Name est nil ou une chaîne vide. Il n'est pas possible de traiter dans la console et utiliser la déclaration return pour terminer la fonction.