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 maybe
Monade, 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
, flatMap
pour 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 fatalError
a un type () -> Never
( ()
est Void
, le type d'unité de Never
Swift , est le type inférieur de Swift). L'appeler produit Never
, ce qui n'est pas compatible avec l' T
attendu 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 Never
type 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) -> T
signature de ??
.
(x ? 3 : throw new Exception())
est remplacé à des fins d'analyse par quelque chose de plus(x ? 3 : absurd(throw new Exception()))
?