Conditions Optionnelles

Comprendre l'utilisation des conditions optionnelles pour travailler avec des valeurs optionnelles en toute sécurité.

Voir sur YouTube

En Swift, les conditions optionnelles avec if let, guard let, et else sont des moyens puissants de travailler avec des optionnels (optionals), c'est-à-dire des valeurs qui peuvent soit contenir une valeur soit être nil. Ces constructions permettent d'accéder en toute sécurité à la valeur encapsulée dans un optional, en garantissant que le code ne tente pas de déballer (unwrap) une valeur nil, ce qui entraînerait une erreur.

Optionnels en Swift

Un type optionnel est un type qui peut contenir une valeur ou être nil. Il est déclaré en ajoutant un point d'interrogation ? après le type de la variable.

Exemple :

var name: String? = "John"

Ici, name peut soit contenir une chaîne de caractères (String), soit être nil.

Utilisation de if let

L'instruction if let est utilisée pour vérifier si un optional contient une valeur. Si c'est le cas, cette valeur est déballée (unwrapped) et assignée à une nouvelle constante temporaire, qui est alors utilisable dans le bloc de code associé.

Syntaxe :

if let constantName = optionalValue {
    // Code à exécuter si optionalValue n'est pas nil
} else {
    // Code à exécuter si optionalValue est nil (facultatif)
}
  • constantName : La constante temporaire qui contient la valeur déballée si l'optional contient une valeur.
  • optionalValue : L'optional que vous essayez de déballer.

Exemple :

var name: String? = "Alice"
if let unwrappedName = name {
    print("Bonjour, \(unwrappedName)!")
} else {
    print("Le nom est nil.")
}
// Affiche : "Bonjour, Alice!"

Si name contient une valeur, elle est déballée et utilisée dans le bloc if. Si name est nil, le bloc else est exécuté (s'il est présent).

Utilisation de guard let

L'instruction guard let est similaire à if let, mais elle est souvent utilisée pour sortir d'une fonction ou d'une boucle si l'optional est nil. Elle est utilisée pour assurer que certaines conditions sont remplies avant de continuer l'exécution du code.

Syntaxe :

guard let constantName = optionalValue else {
    // Code à exécuter si optionalValue est nil
    return
}
// Code à exécuter si optionalValue n'est pas nil
  • Le bloc de code après else est exécuté si la condition de guard let échoue (c'est-à-dire si l'optional est nil). Ce bloc doit toujours inclure une sortie de la fonction actuelle (par exemple, return, break, continue, ou throw).
  • Si la condition est vraie (l'optional n'est pas nil), la constante temporaire est disponible pour être utilisée dans le reste de la fonction après le guard.

Exemple :

func greet(person: String?) {
    guard let unwrappedPerson = person else {
        print("Le nom est nil.")
        return
    }
    print("Bonjour, \(unwrappedPerson)!")
}
greet(person: "Bob")  // Affiche : "Bonjour, Bob!"
greet(person: nil)    // Affiche : "Le nom est nil."

Ici, guard let assure que la fonction ne continue que si person n'est pas nil. Sinon, la fonction sort avec return.

Différences entre if let et guard let

  • if let : Utilisé pour des vérifications locales où le code ne dépend pas nécessairement de l'existence de la valeur déballée après la condition. Le code à l'intérieur du bloc if est exécuté uniquement si l'optional n'est pas nil.
  • guard let : Utilisé pour assurer la présence d'une valeur avant de continuer l'exécution du reste de la fonction. Il est particulièrement utile en début de fonction pour valider les paramètres ou les conditions requises. Le code suivant le guard ne s'exécute que si la condition est remplie.

Chaining de if let ou guard let

Vous pouvez également enchaîner plusieurs optionnels avec if let ou guard let, permettant de déballer plusieurs optionnels en une seule condition.

Exemple avec if let :

let firstName: String? = "Jane"
let lastName: String? = "Doe"
if let first = firstName, let last = lastName {
    print("Bonjour, \(first) \(last)!")
} else {
    print("Un des noms est nil.")
}
// Affiche : "Bonjour, Jane Doe!"

Exemple avec guard let :

func greet(firstName: String?, lastName: String?) {
    guard let first = firstName, let last = lastName else {
        print("Un des noms est nil.")
        return
    }
    print("Bonjour, \(first) \(last)!")
}
greet(firstName: "Jane", lastName: "Doe")  // Affiche : "Bonjour, Jane Doe!"
greet(firstName: nil, lastName: "Doe")     // Affiche : "Un des noms est nil."

Optionnels avec else

L'instruction else dans le contexte de if let ou guard let sert à définir le code qui s'exécute si l'optional est nil. C'est une façon sécurisée de gérer les cas où la valeur n'est pas présente.

Conclusion

  • if let est utilisé pour gérer des optionnels de manière locale, en exécutant du code uniquement si l'optional n'est pas nil.
  • guard let est utilisé pour vérifier et assurer des préconditions, permettant de quitter la fonction si ces conditions ne sont pas remplies.

Ces constructions sont essentielles pour travailler en toute sécurité avec les optionnels dans Swift, garantissant que votre code est protégé contre les erreurs liées aux valeurs nil.