Kita tahu bahwa kita dapat menggunakan if let
pernyataan sebagai singkatan untuk memeriksa opsional nil kemudian membuka bungkusnya.
Namun, saya ingin menggabungkannya dengan ekspresi lain menggunakan operator AND logis &&
.
Jadi, misalnya, di sini saya melakukan rangkaian opsional untuk membuka bungkus dan secara opsional men-downcast rootViewController saya ke tabBarController. Tapi daripada membuat pernyataan if bersarang, saya ingin menggabungkannya.
if let tabBarController = window!.rootViewController as? UITabBarController {
if tabBarController.viewControllers.count > 0 {
println("do stuff")
}
}
Pemberian gabungan:
if let tabBarController = window!.rootViewController as? UITabBarController &&
tabBarController.viewControllers.count > 0 {
println("do stuff")
}
}
Di atas memberikan kesalahan kompilasi Penggunaan pengenal yang belum terselesaikan 'tabBarController'
Menyederhanakan:
if let tabBarController = window!.rootViewController as? UITabBarController && true {
println("do stuff")
}
Ini memberikan kesalahan kompilasi Nilai terikat dalam pengikatan bersyarat harus berjenis Opsional . Setelah mencoba berbagai variasi sintaksis, masing-masing memberikan kesalahan compiler yang berbeda. Saya belum menemukan kombinasi pemenang dari urutan dan tanda kurung.
Jadi, pertanyaannya adalah, apakah mungkin dan jika demikian apa sintaks yang benar?
Perhatikan bahwa saya ingin melakukan hal ini dengan if
pernyataan tidak sebuah switch
pernyataan atau ternary ?
operator.
sumber
var foo : Int? = 10; if let bar = foo { if bar == 10 { println("Great success!") }}
if let bar = foo && bar == 10
adalahUse of unresolved identifier "bar"
(pada yang keduabar
, tentu saja).bridgeToObjectiveC
hilang dalam beta 5 (dan sangat mungkin tidak pernah dimaksudkan untuk penggunaan umum). 2. Lagipula, adafirst
metode untukArray
tipe bawaan Swift .Jawaban:
Mulai Swift 1.2, ini sekarang dimungkinkan . The Swift 1.2 dan Xcode 6.3 beta catatan rilis negara:
Dengan pernyataan di atas, sintaksnya menjadi:
Ini menggunakan
where
klausa.Contoh lain, kali ini mentransmisikan
AnyObject
keInt
, membuka bungkus opsional, dan memeriksa bahwa opsional yang tidak dibungkus memenuhi kondisi:Untuk mereka yang sekarang menggunakan Swift 3, "di mana" telah diganti dengan koma. Oleh karena itu, padanannya adalah:
sumber
Dalam Swift 3 Max MacLeod contoh akan terlihat seperti ini:
Itu
where
diganti dengan,
sumber
if let
hanya dapat melanjutkan jika opsional berhasil dibuka dan ditetapkan ke nama variabel baru. Jika Anda mengatakannyaOR <something else>
maka Anda dapat dengan mudah melewati seluruh tujuan fileif let
. Untuk logika OR, lakukan saja normalif
dan di dalam tubuh berurusan dengan fakta bahwa objek pertama masih opsional pada saat itu (tidak terbuka).Jawaban Max benar dan salah satu caranya. Perhatikan juga bahwa ketika ditulis seperti ini:
if let a = someOptional where someBool { }
The
someOptional
ekspresi akan diselesaikan terlebih dahulu. Jika gagal makasomeBool
ekspresi tidak akan dievaluasi (evaluasi hubung singkat, seperti yang Anda harapkan).Jika Anda ingin menulis sebaliknya, dapat dilakukan seperti ini:
if someBool, let a = someOptional { }
Dalam hal
someBool
ini dievaluasi terlebih dahulu, dan hanya jika dievaluasi ke true,someOptional
ekspresi dievaluasi.sumber
Swift 4 , saya akan menggunakan,
sumber
Ini tidak mungkin.
Dari tata bahasa Swift
if-condition harus berupa ekspresi atau deklarasi. Anda tidak bisa memiliki ekspresi dan deklarasi.
let foo = bar
adalah deklarasi, tidak mengevaluasi ke nilai yang sesuaiBooleanType
. Ini mendeklarasikan konstanta / variabelfoo
.Solusi asli Anda cukup baik, jauh lebih mudah dibaca daripada menggabungkan kondisi.
sumber
let foo = bar
adalah deklarasi bukan ekspresi. Anda tidak dapat melakukannyalet boolValue = (let foo = bar)
Saya pikir proposisi asli Anda tidak terlalu buruk. Alternatif (yang lebih berantakan) adalah:
sumber
tabBarController
lagi