Swift 2 a introduit le guard
mot - clé, qui pourrait être utilisé pour s'assurer que diverses données sont configurées prêtes à l'emploi. Un exemple que j'ai vu sur ce site Web montre une fonction submitTapped:
func submitTapped() {
guard username.text.characters.count > 0 else {
return
}
print("All good")
}
Je me demande si l'utilisation guard
est différente de la faire à l'ancienne, en utilisant une if
condition. Cela donne-t-il des avantages que vous ne pourriez pas obtenir en utilisant un simple chèque?
swift2
guard-statement
David Snabel
la source
la source
Réponses:
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:
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:
Ce même modèle s'applique également aux valeurs non facultatives:
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,
.
Ici, la valeur déballée ne serait disponible qu'à l'intérieur du bloc if
la source
let x = x where x > 0
cela signifie-t-il que vous avez associé une autre condition à votre liaison facultative? Je veux dire que c'est un peu différent deif let constantName = someOptional { statements }
Contrairement à
if
,guard
crée la variable accessible depuis l'extérieur de son bloc. Il est utile de déballer un grand nombre deOptional
s.la source
Il y a vraiment deux gros avantages
guard
. L'un évite la pyramide du destin, comme d'autres l'ont mentionné - beaucoup de ennuyeuxif let
déclarations imbriquées les unes dans les autres se déplaçant de plus en plus vers la droite.L'autre avantage est souvent que la logique que vous souhaitez implémenter est plus "
if not let
" que "if let { } else
".Voici un exemple: supposons que vous souhaitiez implémenter
accumulate
- un croisement entremap
etreduce
où cela vous donne un tableau de réduction en cours d' exécution . Le voici avecguard
:Comment l'écririez-vous sans garde, mais toujours en utilisant
first
cela renvoie une option? Quelque chose comme ça:L'imbrication supplémentaire est ennuyeuse, mais aussi, ce n'est pas aussi logique d'avoir le
if
et leelse
si éloignés. Il est beaucoup plus lisible d'avoir la sortie anticipée pour le cas vide, puis de continuer avec le reste de la fonction comme si ce n'était pas une possibilité.la source
Lorsqu'une condition est remplie,
guard
elle expose les variables déclarées dans leguard
bloc au reste du bloc de code, les amenant dans sa portée. Ce qui, comme indiqué précédemment, sera certainement utile avec lesif let
déclarations imbriquées .Notez que le gardien requiert un retour ou un lancer dans sa déclaration else.
Analyser JSON avec Guard
Voici un exemple de la façon dont on pourrait analyser un objet JSON en utilisant guard plutôt que if-let. Ceci est un extrait d'une entrée de blog qui comprend un fichier de terrain de jeu que vous pouvez trouver ici:
Comment utiliser Guard dans Swift 2 pour analyser JSON
aire de jeux de téléchargement: aire de jeux de garde
Plus d'informations:
Voici un extrait du Guide du langage de programmation Swift:
la source
Un avantage est l'élimination d'un grand nombre d'
if let
instructions imbriquées . Voir la vidéo "Quoi de neuf dans Swift" de la WWDC vers 15h30, la section intitulée "Pyramide de Doom".la source
Quand utiliser des gardes
Si vous avez un contrôleur de vue avec quelques éléments UITextField ou un autre type d'entrée utilisateur, vous remarquerez immédiatement que vous devez déballer le textField.text facultatif pour accéder au texte à l'intérieur (le cas échéant!). isEmpty ne vous fera aucun bien ici, sans aucune entrée, le champ de texte retournera simplement nil.
Vous en avez donc quelques-unes que vous dépliez et que vous passez éventuellement à une fonction qui les publie sur un point de terminaison de serveur. Nous ne voulons pas que le code du serveur doive traiter avec des valeurs nulles ou envoyer par erreur des valeurs invalides au serveur, nous allons donc déballer ces valeurs d'entrée avec garde en premier.
Vous remarquerez que notre fonction de communication avec le serveur prend comme paramètres des valeurs de chaîne non facultatives, d'où le déballage préalable de la garde. Le déballage n'est pas intuitif car nous sommes habitués à déballer avec if let qui déballe les valeurs à utiliser dans un bloc. Ici, l'instruction guard a un bloc associé mais c'est en fait un bloc else - c'est-à-dire la chose que vous faites si le débouclage échoue - les valeurs sont déroulées directement dans le même contexte que l'instruction elle-même.
// séparation des préoccupations
Sans garde
Sans utiliser de garde, nous nous retrouverions avec un gros tas de code qui ressemble à une pyramide de malheur . Cela ne convient pas bien pour l'ajout de nouveaux champs à notre formulaire ou pour un code très lisible. L'indentation peut être difficile à suivre, en particulier avec tant d'autres instructions à chaque fork.
Oui, nous pourrions même combiner tout cela si les instructions let en une seule instruction séparées par des virgules, mais nous perdrions la possibilité de déterminer quelle instruction a échoué et de présenter un message à l'utilisateur.
https://thatthinginswift.com/guard-statement-swift/
la source
En utilisant la garde, notre intention est claire. nous ne voulons pas exécuter le reste du code si cette condition particulière n'est pas satisfaite. ici, nous pouvons également étendre la chaîne, veuillez consulter le code ci-dessous:
la source
Déclaration de garde va faire. c'est différent
1) il me permet de réduire l'imbrication si l'énoncé
2) c'est d'augmenter ma portée que ma variable accessible
if
Déclaration de la garde
la source
Déclaration de la garde
Une instruction de garde est utilisée pour transférer le contrôle du programme hors d'une portée si une ou plusieurs conditions ne sont pas remplies.
Synatx:
Avantage:
1. En utilisant la
guard
déclaration, nous pouvons nous débarrasser des conditionnels profondément imbriqués dont le seul but est de valider un ensemble d'exigences.2. Il a été spécialement conçu pour quitter rapidement une méthode ou une fonction.
si vous utilisez si laissé ci-dessous est le code à quoi il ressemble.
En utilisant guard, vous pouvez transférer le contrôle hors de la portée si une ou plusieurs conditions ne sont pas remplies.
Référence:
1. Swift 2: Sortez tôt avec garde 2. Udacity 3. Déclaration de garde
la source
if condition { return }
bourru?Comme une instruction if, guard exécute des instructions basées sur la valeur booléenne d'une expression. Contrairement à une instruction if, les instructions guard ne s'exécutent que si les conditions ne sont pas remplies. Vous pouvez penser à la garde plus comme une assertion, mais plutôt que de planter, vous pouvez quitter gracieusement.
voir: http://ericcerney.com/swift-guard-statement/
la source
Cela rend vraiment le flux d'une séquence avec plusieurs recherches et options beaucoup plus concis et clair et réduit beaucoup d'imbrication. Voir le post d'Erica Sadun sur le remplacement des Ifs . .... Pourrait se laisser emporter, un exemple ci-dessous:
Voyez si ça colle.
la source
Autrement dit, il fournit un moyen de valider les champs avant l'exécution. Il s'agit d'un bon style de programmation car il améliore la lisibilité. Dans d'autres langues, cela peut ressembler à ceci:
Mais parce que Swift vous fournit des options, nous ne pouvons pas vérifier si elle est nulle et affecter sa valeur à une variable. En revanche,
if let
vérifie qu'il n'est pas nul et attribue une variable pour contenir la valeur réelle. C'est làguard
qu'entre en jeu. Il vous donne un moyen plus concis de quitter tôt en utilisant les options.la source
Source: Garde dans Swift
Voyons l'exemple pour bien le comprendre
Exemple 1:
Dans l'exemple ci-dessus, nous voyons que 3 est supérieur à 2 et l'instruction à l'intérieur de la clause guard else est ignorée et True est imprimé.
Exemple 2:
Dans l'exemple ci-dessus, nous voyons que 1 est inférieur à 2 et l'instruction à l'intérieur de la clause guard else est exécutée et False est imprimé suivi d'un retour.
Dans l'exemple ci-dessus, nous utilisons guard let pour déballer les options. Dans la fonction getName, nous avons défini une variable de type chaîne myName qui est facultative. Nous utilisons ensuite guard let pour vérifier si la variable myName est nulle ou non, sinon assigner à name et vérifier à nouveau, name n'est pas vide. Si les deux conditions sont remplies, c'est-à-dire vraies, le bloc else sera ignoré et affichera «Les conditions sont remplies avec le nom».
Fondamentalement, nous vérifions ici deux choses séparées par une virgule, d'abord déballer et facultatif et vérifier si cela satisfait ou non à la condition.
Ici, nous ne transmettons rien à la fonction, c'est-à-dire une chaîne vide et donc la condition est fausse est imprimée.
Ici, nous passons "Bonjour" à la fonction et vous pouvez voir que la sortie est imprimée "La condition est remplie Bonjour".
la source