Dans Swift, comment puis-je écrire un cas dans une instruction switch qui teste la valeur commutée par rapport au contenu d'un optionnel , en sautant le cas si le optionnel contient nil
?
Voici à quoi 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 viens d' écrire exactement comme ça, le compilateur se plaint que someOptional
n'est pas déballés, mais si je explicitement Déballer en ajoutant !
à la fin, je cours d'obtenir une erreur d'exécution tout moment someOptional
contient nil
. Ajouter à la ?
place de !
aurait du sens pour moi (dans l'esprit du chaînage optionnel, je suppose), mais ne fait pas disparaître l'erreur du compilateur (c'est-à-dire qu'il ne déballe pas réellement l'option).
la source
À partir de Xcode 7 (à partir des notes de version de la version bêta 1), "un nouveau
x?
modèle peut être utilisé pour la correspondance de modèles avec des options en tant que synonyme de.Some(x)
." Cela signifie que dans Xcode 7 et versions ultérieures, la variante suivante de la réponse de rintaro fonctionnera également:la source
someValue?
est une autre valeur définie, maiscase let val?
est-ce juste la version non emballée sûre desomeOptional
?!let
ne se compile plus. Je ne me souviens pas pour le moment pourquoi cela aurait fonctionné à l'époque.Dans Swift 4, vous pouvez utiliser Optional: ExpressibleByNilLiteral of Apple pour envelopper facultatif
https://developer.apple.com/documentation/swift/optional
Exemple
certains
aucun
défaut
Énumération avec valeur
une certaine valeur
la source