En Swift, le pattern matching avec Optional permet de traiter élégamment et en toute sécurité des valeurs qui peuvent être nil. En plus de la vérification directe via if let et guard let, d'autres options sont disponibles, telles que case let, if case, guard case, particulièrement utiles lorsqu'il faut non seulement extraire une valeur, mais aussi imposer des conditions supplémentaires.
Exemple d'extraction standard :
if let value = optionalValue { print("La valeur est \(value)") }
Exemple de pattern matching avec condition :
if case let .some(value) = optionalValue, value > 10 { print("La valeur est supérieure à 10 : \(value)") }
De même avec guard :
guard case let .some(value) = optionalValue else { return }
Nuances :
Quelle est la différence entre les constructions if let value = x as? Int et if case let value? = x lors de la manipulation des optionnels en Swift ?
Réponse :
if let value = x as? Int est utilisé pour le binding optionnel avec conversion de type.if case let value? = x est un pattern matching qui extrait une valeur non-nil d'un optional.Exemple :
let x: Int? = 42 if case let value? = x { print("la valeur est \(value)") // Affichera 42 }
Cela fonctionnera lorsque x n'est pas nil, sans effectuer de conversion de type supplémentaire, contrairement à as?.
Histoire
Un développeur a tenté d'effectuer plusieurs bindings optionnels dans une seule expression avec
if let, sans connaître le pattern matching avec des tuples. En conséquence, le code est devenu plus compliqué à cause de if imbriqués, alors qu'une solution correcte aurait permis de combiner les vérifications avecif case let (a?, b?) = (a, b), améliorant ainsi la lisibilité et la sécurité.
Histoire
Un pattern matching du type
if case .some(let value) = optional, value > 10 {...}a été réalisé, mais la possibilité de nil a été négligée, ce qui a conduit à la branche else à contenir non seulement des valeurs < 10, mais aussi nil.
Histoire
Une mauvaise construction a été utilisée pour les énumérations optionnelles (par exemple, if case .some(let .myCase(value)) = x), ce qui a conduit à un plantage avec une valeur nil. La bonne façon est de d'abord déballer l'optional via if let, puis d'effectuer le pattern matching sur l'énumération.