J'ai lu sur les options dans Swift, et j'ai vu des exemples où if let
est utilisé pour vérifier si une option contient une valeur, et au cas où elle le ferait, faites quelque chose avec la valeur non emballée.
Cependant, j'ai vu que dans Swift 2.0, le mot guard let
- clé est principalement utilisé. Je me demande si if let
a été supprimé de Swift 2.0 ou s'il est toujours possible de l'utiliser.
Dois-je changer mes programmes qui contiennent if let
en guard let
?
la source
if let
lorsque lenon-nil
cas est valide. À utiliserguard
lorsque lenil
cas représente une sorte d'erreur.guard
est approprié même s'il n'y a pas d'erreur. Parfois, cela signifie simplement qu'il n'y a rien à faire. Par exemple, unepositionTitle
méthode pourraitguard if let title = title else {return}
. Le titre peut être facultatif, auquel cas ce n'est pas une erreur. Maisguard let
c'est toujours approprié.if let
n'est visible qu'à l' intérieurif let
portée. La variable liée parguard let
est visible par la suite. Il est donc logique d'utiliser guard pour lier également des valeurs facultatives.La garde peut améliorer la clarté
Lorsque vous utilisez guard, vous espérez beaucoup plus que le guard réussisse et il est quelque peu important que s'il ne réussit pas, vous souhaitiez simplement quitter la portée plus tôt . Comme vous vous gardez de voir si un fichier / image existe, si un tableau est vide ou non.
Si vous écrivez le code ci-dessus avec if-let, cela indique au développeur de lecture qu'il s'agit plus d'un 50-50. Mais si vous utilisez guard, vous ajoutez de la clarté à votre code et cela implique que je m'attends à ce que cela fonctionne 95% du temps ... si cela échouait, je ne sais pas pourquoi; c'est très peu probable ... mais utilisez simplement cette image par défaut à la place ou peut-être simplement affirmer avec un message significatif décrivant ce qui n'a pas fonctionné!
De plus, en raison des suggestions ci-dessus et du code propre, il est plus probable que vous souhaitiez / devrez ajouter des assertions dans failed déclarations de garde , cela améliore simplement la lisibilité et indique clairement aux autres développeurs ce que vous attendiez.
(vous n'utiliserez pas d'assertions / conditions préalables pour
if-let
s. Cela ne semble tout simplement pas correct)L'utilisation de gardes vous aide également à améliorer la clarté en évitant la pyramide de malheur. Voir la réponse de Nitin .
Guard crée un nouvelle variable
Il y a une différence importante que je pense que personne n'a bien expliqué.
Les deux
guard let
etif let
dérouler la variable cependantAvec
guard let
vous créez une nouvelle variable qui existera dehors de l'else
instruction.Avec
if let
vous ne créez pas de nouvelle variable - après l'instruction else, vous n'entrez le bloc de code que si l'option facultative n'est pas nulle. La variable nouvellement créée n'existe qu'à l' intérieur du bloc de code pas après!guard let:
if-let:
Pour plus d'informations,
if let
voir: Pourquoi la redéclaration de liaison facultative ne crée pas d'erreurLa garde exige sortie de la lunette
(Également mentionné dans la réponse de Rob Napier):
Vous DEVEZ avoir
guard
défini à l' intérieur d' une fonction. Son objectif principal est d'abandonner / de renvoyer / de quitter la portée, si une condition n'est pas remplie:Car
if let
vous n'avez pas besoin de l'avoir dans une fonction:guard
contreif
Il convient de noter qu'il est plus approprié de voir cette question comme
guard let
vsif let
etguard
vsif
.Un standalone
if
ne fait aucun déballage, pas plus qu'un standaloneguard
. Voir l'exemple ci-dessous. Il ne se termine pas tôt si une valeur estnil
. Il n'y a AUCUNE valeur facultative. Il sort juste tôt si une condition n'est pas remplie.la source
Quand utiliser
if-let
et quand utiliserguard
est souvent une question de style.Supposons que vous ayez
func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int
et un tableau facultatif d'éléments (var optionalArray: [SomeType]?
), et que vous devez renvoyer soit0
si le tableau estnil
(non défini), soitcount
si le tableau a une valeur (est défini).Vous pouvez l'implémenter comme ceci en utilisant
if-let
:ou comme ceci en utilisant
guard
:Les exemples sont fonctionnellement identiques.
Où
guard
qui brille vraiment, c'est lorsque vous avez une tâche comme la validation des données et que vous voulez que la fonction échoue tôt si quelque chose ne va pas.Au lieu d'imbriquer un tas de
if-let
s au fur et à mesure que vous vous rapprochez de la fin de la validation, le "chemin de réussite" et les options désormais liées avec succès sont tous dans la portée principale de la méthode, car les chemins d'échec sont déjà tous retournés.la source
Je vais essayer d'expliquer l'utilité des déclarations de garde avec du code (non optimisé).
Vous disposez d'une interface utilisateur dans laquelle vous validez les champs de texte pour l'enregistrement de l'utilisateur avec le prénom, le nom, l'e-mail, le téléphone et le mot de passe.
Si un textField ne contient pas de texte valide, il doit faire de ce champ firstResponder.
voici le code non optimisé:
Vous pouvez voir ci-dessus, que toutes les chaînes (firstNameString, lastNameString, etc.) ne sont accessibles que dans la portée de l'instruction if. donc il crée cette "pyramide de malheur" et a de nombreux problèmes avec elle, y compris la lisibilité et la facilité de déplacer les choses (si l'ordre des champs est modifié, vous devez réécrire la plupart de ce code)
Avec l'instruction de garde (dans le code ci-dessous), vous pouvez voir que ces chaînes sont disponibles en dehors de
{}
et sont utilisées, si tous les champs sont valides.Si l'ordre des champs change, déplacez simplement les lignes de code respectives vers le haut ou vers le bas, et vous êtes prêt à partir.
Ceci est une explication très simple et un cas d'utilisation. J'espère que cela t'aides!
la source
Différence de base
Garde laisser
si laissez
REMARQUE: les deux sont utilisés pour dérouler la variable facultative.
la source
L'explication la plus claire que j'ai vue était dans le guide de style Github Swift :
if
ajoute un niveau de profondeur:guard
ne:la source
garde
Une déclaration de garde a la forme suivante:
si laissez
la source
J'ai appris cela de Swift avec Bob.
Else-If typique
Problèmes avec Else-If
Déclaration de garde Un bloc de garde ne s'exécute que si la condition est fausse, et il sortira de la fonction par retour. Si la condition est vraie, Swift ignore le bloc de garde. Il fournit une sortie anticipée et moins de parenthèses. +
Développer les options avec Else-If
Une instruction de garde n'est pas seulement utile pour remplacer un bloc conditionnel typique par une instruction else-if, mais aussi pour déballer les options en minimisant le nombre de crochets. Pour comparer, commençons par déballer plusieurs options avec else-if. Tout d'abord, créons trois options qui seront déballées.
Le pire cauchemar
Le code ci-dessus fonctionne certainement mais viole le principe DRY. C'est atroce. Décomposons-le +.
Légèrement mieux Le code ci-dessous est plus lisible que ci-dessus. +
Unwrap with Guard Les instructions else-if peuvent être remplacées par guard. +
Développer plusieurs options avec Else-If Jusqu'à présent, vous avez déballé les options une par une. Swift nous permet de déplier plusieurs options à la fois. Si l'un d'eux contient nil, il exécutera le bloc else.
Développer plusieurs options avec Guard Bien sûr, nous devrions utiliser guard sur else-if. +
la source