Düşünebileceğim bir kullanım var ve bu, Swift programlama dilinde bir gelişme olarak kabul edildi.
Swift'in bir maybeMonad'ı 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, flatMapdeğ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 fatalErrortürü vardır () -> Never( ()olduğu Void, Swift'in' birimi türü, NeverSwift'in alt türüdür). Onu çağırmak üretilir Never, bu da Tdoğ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ı Nevertüm türlerinin bir alt tipi be.
Eğer Neverher 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?