Ungkapan untuk berurusan dengan opsional di Swift tampaknya terlalu banyak bertele-tele, jika semua yang ingin Anda lakukan adalah memberikan nilai default dalam kasus di mana nihil:
if let value = optionalValue {
// do something with 'value'
} else {
// do the same thing with your default value
}
yang melibatkan duplikasi kode yang tidak perlu, atau
var unwrappedValue
if let value = optionalValue {
unwrappedValue = value
} else {
unwrappedValue = defaultValue
}
yang membutuhkan unwrappedValue
tidak konstan.
Opsi Scala's monad (yang pada dasarnya ide yang sama dengan Swift's Optional) memiliki metode getOrElse
untuk tujuan ini:
val myValue = optionalValue.getOrElse(defaultValue)
Apakah saya melewatkan sesuatu? Apakah Swift sudah memiliki cara yang kompak untuk melakukannya? Atau, jika gagal, apakah mungkin untuk mendefinisikan getOrElse
ekstensi untuk Opsional?
Jawaban:
Memperbarui
Apple sekarang telah menambahkan operator penggabungan:
Operator ternary adalah teman Anda dalam hal ini
Anda juga dapat memberikan ekstensi sendiri untuk enum Opsional:
Maka Anda bisa melakukan:
Namun, saya sarankan tetap berpegang pada operator ternary karena pengembang lain akan memahami itu lebih cepat tanpa harus menyelidiki
or
metode iniCatatan : Saya memulai modul untuk menambahkan pembantu umum seperti ini
or
padaOptional
ke cepat.sumber
unwrappedValue
ini masih merupakan tipe opsional untuk kasus ini di Swift 1.2:var unwrappedValue = optionalValue ? optionalValue! : defaultValue
(xcode 6 beta 4). Apakah ini sudah berubah???
perilaku inferensi tipe standar adalah mengembalikan opsional, yang biasanya bukan yang Anda inginkan. Anda dapat mendeklarasikan variabel sebagai non-opsional dan ini berfungsi dengan baik.Pada Agustus 2014, Swift memiliki operator penggabungan (??) yang memungkinkan. Misalnya, untuk myOptional String opsional, Anda dapat menulis:
sumber
jika Anda menulis:
dan
optionalValue != nil
kemudianresult
akanoptional
terlalu dan Anda akan perlu membukanya di masa depanTetapi Anda dapat menulis operator
Sekarang kamu bisa:
Dan kapan
optionalValue != nil
ituresult
akan terjadiunwraped
sumber
Tampaknya ini berhasil
namun kebutuhan untuk melakukan cast
value as T
adalah hack yang jelek. Idealnya, harus ada cara untuk menegaskan bahwaT
itu sama dengan jenis yang terdapat dalam Opsional. Seperti berdiri, ketik set menyimpulkanT
berdasarkan parameter yang diberikan untuk getOrElse, dan kemudian gagal saat runtime jika ini tidak cocok dengan Opsional dan Opsional adalah nihil:sumber
T
untuk metode ini. Itu benar-benar mengesampingkan yang adaT
dari Opsional. Anda bisa melakukannya:func getOrElse(defaultValue: T) -> T
lalu T mengacu pada tipe nilai real dari opsional dan Anda tidak perlu mengetik memeriksanyaT
itu? (Di luar hanya dengan asumsi berdasarkan konvensi)Optional
dalam Xcode, Anda akan melihat bahwa itu didefinisikan sebagaienum Optional<T>