Guard let ou if let ?

Bonjour tout le monde! :slight_smile:

Je suis occupé de suivre un tutoriel sur CoreData, et je me posais une question:
Je suis face à ce code ci:

guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else {
    return
} 
// Suite du code

mais en regardant, je peux tout à fait le remplacer par:

if let appDelegate = UIApplication.shared.delegate as? AppDelegate {
        // Suite du code
}

Je me trompe?

Donc, ma question: pourquoi utiliser un guard? Qu’est ce qui est le plus efficace? Plutôt une question de goût? Il y’a surement d’autre impact, non?

Merci de m’éclairer :slight_smile:

Bonne journée à tous,

Alexandre.

Bonjour,

Alors la différence, c’est que le “guard” va exécuter le code qui est dans les accolades quand la condition est fausse et arrête la fonction avec le “return”.

Tandis que le “if” va faire l’inverse. Il exécute le code dans les accolades si, le condition est vrai.

“guard” pourrait être traduit par "assure toi que la condition est vrai sinon { fait ceci }
et “if let” c’est si la condition est vrai { fait ceci }

Alors, pourquoi utiliser un “guard” ?

Ça permet d’enlever une indentation par rapport au “if” et avoir une meilleur lisibilité du code (mais, ça c’est affaire de goût).

Ensuite, entre le deux je ne pense pas qu’il ai une différence sur l’efficacité.

Enfin, oui je pense que c’est une faire de goût mais, je suis un débutant alors, peut être qu’il y a plus que ça.

En espérant t’avoir apporté mon aide.

4 « J'aime »

En effet il n’y a pas de différences de performances, c’est plus une question de lisibilité.
Le guard exprime vraiment une vérification en début de fonction et permet d’annuler l’exécution de la fonction si nécessaire.
Dans ta fonction, si rien ne peut se passer sans ce AppDelegate, alors le guard est plus adapté.
Si seulement certaines parties de ta fonction a besoin du AppDelegate, alors le if est plus adapté.

2 « J'aime »

La seule différence fonctionnelle entre if let et guard c’est la portée de la variable.

Avec un guard la variable appDelegate existe dans la totalité de la fonction.

guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else {
    return
} 
// Suite du code
// appDelegate existe dans tout le corps de la fonction
// ...

Avec un if let elle n’existe qu’entre les parenthèses.

if let appDelegate = UIApplication.shared.delegate as? AppDelegate {
       // Suite du code
       // appDelegate n' existe qu’entre les parenthéses
}
// appDelegate n’existe pas ici ..

Selon les besoins tu peux utiliser l’un et l’autre.

Pour ma part je préfère le guard qui évite une paire de parenthèse comme le signale @ThonyF, et qui améliore la lisibilité du code. J’aime bien l’idée d’effectuer les contrôles de validité des données au début de la fonction, avec des gardiens, pour ne plus y penser plus tard.

EDIT : Grilled par le prof …

3 « J'aime »

Un grand merci à tous les 3 pour les explications! :slight_smile: