Ada satu kegunaan yang bisa saya pikirkan, dan itu adalah sesuatu yang telah dianggap sebagai peningkatan bahasa pemrograman Swift.
Swift memiliki maybeMonad, dieja Optional<T>atau T?. Ada banyak cara untuk berinteraksi dengannya.
Anda dapat menggunakan suka membuka bersyarat seperti
if let nonOptional = someOptional {
print(nonOptional)
}
else {
print("someOptional was nil")
}
Anda dapat menggunakan map, flatMapuntuk mengubah nilai
- Force membuka bungkusan operator (
!, tipe (T?) -> T) untuk secara paksa membuka bungkusan konten, jika tidak memicu kerusakan
Operator nil-penggabungan ( ??, tipe (T?, T) -> T) untuk mengambil nilainya atau menggunakan nilai default:
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
Sayangnya, tidak ada cara ringkas untuk mengatakan "membuka atau membuang kesalahan" atau "membuka atau crash dengan pesan kesalahan khusus". Sesuatu seperti
let someI: Int? = Optional(123)
let nonOptionalI: Int = someI ?? fatalError("Expected a non-nil value")
tidak mengkompilasi, karena fatalErrormemiliki tipe () -> Never( ()adalah Void, Swift' jenis unit, Neveradalah jenis bawah Swift). Memanggilnya menghasilkan Never, yang tidak kompatibel dengan yang Tdiharapkan sebagai operan yang tepat ??.
Dalam upaya untuk memperbaiki ini, Proposal Swift Evolution SE-0217- Operator "Unwrap or Die" diajukan. Itu pada akhirnya ditolak , tetapi itu membangkitkan minat dalam membuat Nevermenjadi subtipe dari semua jenis.
Jika Neverdibuat menjadi subtipe dari semua jenis, maka contoh sebelumnya akan dapat dikompilasi:
let someI: Int? = Optional(123)
let nonOptionalI: Int = someI ?? fatalError("Expected a non-nil value")
karena situs panggilan ??memiliki tipe (T?, Never) -> T, yang akan kompatibel dengan (T?, T) -> Ttanda tangan ??.
(x ? 3 : throw new Exception())diganti untuk keperluan analisis dengan sesuatu yang lebih seperti(x ? 3 : absurd(throw new Exception()))?