Penjilidan opsional
Cepat 3 & 4
var booleanValue : Bool? = false
if let booleanValue = booleanValue, booleanValue {
print("bound booleanValue: '\(booleanValue)'")
}
Swift 2.2.0
var booleanValue : Bool? = false
if let booleanValue = booleanValue where booleanValue {
print("bound booleanValue: '\(booleanValue)'")
}
Kode let booleanValue = booleanValue
kembali false
jika booleanValue
ada nil
dan if
blok tidak dijalankan. Jika booleanValue
tidak nil
, kode ini mendefinisikan variabel baru bernama booleanValue
tipe Bool
(bukan opsional, Bool?
).
Kode Swift 3 & 4 booleanValue
(dan kode Swift 2.2 where booleanValue
) mengevaluasi booleanValue: Bool
variabel baru . Jika benar, if
blok dijalankan dengan booleanValue: Bool
variabel yang baru didefinisikan dalam cakupan (memungkinkan opsi untuk mereferensikan nilai terikat lagi di dalam if
blok).
Catatan: Ini adalah konvensi Swift untuk menamai konstanta / variabel terikat sama dengan konstanta / variabel opsional seperti let booleanValue = booleanValue
. Teknik ini disebut variabel shadowing . Anda bisa keluar dari konvensi dan menggunakan sesuatu seperti let unwrappedBooleanValue = booleanValue, unwrappedBooleanValue
. Saya menunjukkan ini untuk membantu memahami apa yang terjadi. Saya merekomendasikan menggunakan variabel shadowing.
Pendekatan Lainnya
Penggabungan nol
Penggabungan nol jelas untuk kasus khusus ini
var booleanValue : Bool? = false
if booleanValue ?? false {
print("optional booleanValue: '\(booleanValue)'")
}
Memeriksa false
tidak begitu jelas
var booleanValue : Bool? = false
if !(booleanValue ?? false) {
print("optional booleanValue: '\(booleanValue)'")
}
Catatan: if !booleanValue ?? false
tidak dapat dikompilasi.
Paksa buka bungkus opsional (hindari)
Buka paksa bungkusnya meningkatkan kemungkinan bahwa seseorang akan membuat perubahan di masa mendatang yang terkompilasi tetapi mengalami error saat runtime. Oleh karena itu, saya akan menghindari hal seperti ini:
var booleanValue : Bool? = false
if booleanValue != nil && booleanValue! {
print("optional booleanValue: '\(booleanValue)'")
}
Pendekatan Umum
Meskipun pertanyaan stack overflow ini menanyakan secara spesifik bagaimana cara memeriksa apakah a Bool?
ada true
dalam if
pernyataan, akan sangat membantu untuk mengidentifikasi pendekatan umum apakah memeriksa true, false, atau menggabungkan nilai yang tidak dibungkus dengan ekspresi lain.
Karena ungkapan menjadi lebih rumit, saya menemukan pendekatan penjilidan opsional lebih fleksibel dan lebih mudah dipahami daripada pendekatan lain. Perhatikan bahwa karya mengikat opsional dengan jenis opsional ( Int?
, String?
, dll).