Il y a une utilisation à laquelle je peux penser, et c'est quelque chose qui a été considéré comme une amélioration du langage de programmation Swift.
Swift a une maybeMonade, orthographiée Optional<T>ou T?. Il existe de nombreuses façons d'interagir avec.
Vous pouvez utiliser le déballage conditionnel comme
if let nonOptional = someOptional {
print(nonOptional)
}
else {
print("someOptional was nil")
}
Vous pouvez utiliser map, flatMappour transformer les valeurs
- L'opérateur forcer le déballage (
!, de type (T?) -> T) pour dérouler le contenu avec force, déclenchant sinon un crash
L'opérateur coalescent nul ( ??, de type (T?, T) -> T) pour prendre sa valeur ou utiliser une valeur par défaut:
let someI = Optional(100)
print(someI ?? 123) => 100 // "left operand is non-nil, unwrap it.
let noneI: Int? = nil
print(noneI ?? 123) // => 123 // left operand is nil, take right operand, acts like a "default" value
Malheureusement, il n'y avait aucun moyen concis de dire "déballer ou jeter une erreur" ou "déballer ou planter avec un message d'erreur personnalisé". Quelque chose comme
let someI: Int? = Optional(123)
let nonOptionalI: Int = someI ?? fatalError("Expected a non-nil value")
ne compile pas, car fatalErrora un type () -> Never( ()est Void, le type d'unité de NeverSwift , est le type inférieur de Swift). L'appeler produit Never, ce qui n'est pas compatible avec l' Tattendu comme opérande droit de ??.
Pour tenter d'y remédier, Swift Evolution propsoal SE-0217- L'opérateur «Déballer ou mourir» a été proposé. Il a finalement été rejeté , mais il a suscité l'intérêt de faire de ce Nevertype un sous-type de tous types.
Si a Neverété créé pour être un sous-type de tous types, alors l'exemple précédent sera compilable:
let someI: Int? = Optional(123)
let nonOptionalI: Int = someI ?? fatalError("Expected a non-nil value")
car le site d'appel de ??type a (T?, Never) -> T, ce qui serait compatible avec la (T?, T) -> Tsignature de ??.
(x ? 3 : throw new Exception())est remplacé à des fins d'analyse par quelque chose de plus(x ? 3 : absurd(throw new Exception()))?