Düşünebileceğim bir kullanım var ve bu, Swift programlama dilinde bir gelişme olarak kabul edildi.
Swift'in bir maybe
Monad'ı vardır, hecelenmiş Optional<T>
veya T?
. Bununla etkileşime girmenin birçok yolu vardır.
Koşullu açmayı şu şekilde kullanabilirsiniz:
if let nonOptional = someOptional {
print(nonOptional)
}
else {
print("someOptional was nil")
}
Sen kullanabilirsiniz map
, flatMap
değerlerini dönüştürmek için
- İçeriği zorla açmak için operatörü (
!
türden (T?) -> T
) zorla, aksi takdirde bir çökmeyi tetikler
Değerini almak veya başka bir varsayılan değer kullanmak için nil birleştirme operatörü ( ??
, tür (T?, T) -> T
):
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
Maalesef, "paketini aç veya bir hata at" veya "özel bir hata iletisiyle paketini aç veya kilitle" demenin kısa bir yolu yoktu. Gibi bir şey
let someI: Int? = Optional(123)
let nonOptionalI: Int = someI ?? fatalError("Expected a non-nil value")
Çünkü, derleme yapmaz fatalError
türü vardır () -> Never
( ()
olduğu Void
, Swift'in' birimi türü, Never
Swift'in alt türüdür). Onu çağırmak üretilir Never
, bu da T
doğru işlenen olarak beklenen ile uyumlu değildir ??
.
Bunu düzeltmek için Swift Evolution propsoal SE-0217
- “ Paketten Çıkar veya Öl” operatörü ortaya atıldı. Bu edilmiş sonuçta reddedilen , ancak yapımında ilgi kaldırdı Never
tüm türlerinin bir alt tipi be.
Eğer Never
her türlü bir alt tipi olduğu için yapıldı, daha sonra önceki örnek derlenebilir olacaktır:
let someI: Int? = Optional(123)
let nonOptionalI: Int = someI ?? fatalError("Expected a non-nil value")
çünkü çağrı sitesinin imzasıyla uyumlu olan ??
türü vardır .(T?, Never) -> T
(T?, T) -> T
??
(x ? 3 : throw new Exception())
analiz amaçlı bir şeyin yerine daha çok benzer bir şey(x ? 3 : absurd(throw new Exception()))
mi?