Swift: test par rapport à une valeur facultative dans le cas d’un commutateur

Dans Swift, comment puis-je écrire un cas dans une instruction switch qui teste la valeur commutée par rapport au contenu d’une option , en ignorant la casse si l’option contient nil ?

Voici comment j’imagine que cela pourrait ressembler:

 let someValue = 5 let someOptional: Int? = nil switch someValue { case someOptional: // someOptional is non-nil, and someValue equals the unwrapped contents of someOptional default: // either, someOptional is nil, or someOptional is non-nil but someValue does not equal the unwrapped contents of someOptional } 

Si je l’écris exactement comme ça, le compilateur se plaint que someOptional n’est pas déballé, mais si je le décompresse explicitement en ajoutant ! à la fin, je reçois bien sûr une erreur d’exécution à chaque fois que quelque someOptional contient nil . Ajouter ? au lieu de ! Cela aurait du sens pour moi (dans l’esprit du chaînage facultatif, je suppose), mais ne fait pas disparaître l’erreur du compilateur (c’est-à-dire qu’il ne déroule pas les options).

Facultatif est juste une enum comme ceci:

 enum Optional : Reflectable, NilLiteralConvertible { case None case Some(T) // ... } 

Vous pouvez donc les faire correspondre à des schémas correspondants de “valeurs associées” :

 let someValue = 5 let someOptional: Int? = nil switch someOptional { case .Some(someValue): println("the value is \(someValue)") case .Some(let val): println("the value is \(val)") default: println("nil") } 

Si vous voulez obtenir une correspondance avec someValue , utilisez l’ expression de garde :

 switch someValue { case let val where val == someOptional: println(someValue) default: break } 

Et pour Swift> 2.0

 switch someValue { case let val where val == someOptional: print("matched") default: print("didn't match; default") } 

À partir de Xcode 7 (à partir des notes de version bêta 1), «un nouveau x? pattern peut être utilisé pour créer des correspondances avec des options en tant que synonyme de .Some(x) . ”Cela signifie que dans Xcode 7 et versions ultérieures, la variation suivante de la réponse de rintaro fonctionnera également:

 switch someOptional { case someValue?: print("the value is \(someValue)") case let val?: print("the value is \(val)") default: print("nil") }