Saya perlu memeriksa apakah dict memiliki kunci atau tidak. Bagaimana?
objective-c
foundation
profilProfile dontWatch
sumber
sumber
NSDictionary
mengandung kunci (non-spesifik) Anda harus menggunakan[dictionary allKeys].count == 0
Jikacount
ini0
tidak ada kunci diNSDictionary
.Jawaban:
objectForKey
akan mengembalikan nol jika kunci tidak ada.sumber
[NSNull null]
sebagai gantinya.atau
sumber
Versi Objective-C dan Clang yang lebih baru memiliki sintaksis modern untuk ini:
Anda tidak perlu memeriksa kesetaraan dengan nil, karena hanya objek Objective-C yang tidak nihil yang dapat disimpan dalam kamus (atau array). Dan semua objek Objective-C adalah nilai kebenaran. Merata
@NO
,@0
dan[NSNull null]
mengevaluasi sebagai benar.Sunting: Swift sekarang menjadi sesuatu.
Untuk Swift Anda akan mencoba sesuatu seperti yang berikut ini
Sintaks ini hanya akan mengeksekusi blok if jika myKey ada dalam dict dan jika ya maka nilai tersebut disimpan dalam variabel value. Perhatikan bahwa ini berfungsi bahkan untuk nilai falsey seperti 0.
sumber
sumber
Saat menggunakan kamus JSON:
sumber
Saya suka jawaban Fernandes meskipun Anda meminta keberatan dua kali.
Ini juga harus dilakukan (kurang lebih sama dengan Martin A).
Martin dan jawaban ini berfungsi pada iPad2 iOS 5.0.1 9A405
sumber
Satu gotcha yang sangat jahat yang hanya menghabiskan sedikit waktu saya untuk debugging - Anda mungkin menemukan diri Anda diminta oleh pelengkapan otomatis untuk mencoba menggunakan
doesContain
yang tampaknya berfungsi.Kecuali,
doesContain
gunakan perbandingan id daripada perbandingan hash yang digunakan olehobjectForKey
jadi jika Anda memiliki kamus dengan kunci string, ia akan mengembalikan TIDAK ke adoesContain
.sumber
Menggunakan Swift, itu akan menjadi:
sumber
Iya. Kesalahan semacam ini sangat umum dan menyebabkan aplikasi crash. Jadi saya gunakan untuk menambahkan NSDictionary di setiap proyek seperti di bawah ini:
//.h kode file:
//.m kode file adalah seperti di bawah ini
Dalam kode Anda dapat menggunakan seperti di bawah ini:
sumber
Untuk memeriksa keberadaan kunci di NSDictionary:
sumber
Karena nil tidak dapat disimpan dalam struktur data Foundation
NSNull
terkadang mewakili anil
. KarenaNSNull
adalah objek tunggal yang dapat Anda periksa untuk melihat apakahNSNull
nilai disimpan dalam kamus dengan menggunakan perbandingan pointer langsung:sumber
NSNull
instance tunggal telah disimpan dalam kamus sebagai nilai untuk kunci@"myKey"
. Itu hal yang sama sekali berbeda dengan kunci yang@"myKey"
tidak ada dalam kamus - memang keduanya saling eksklusif.Solusi untuk swift 4.2
Jadi, jika Anda hanya ingin menjawab pertanyaan apakah kamus berisi kunci, tanyakan:
Jika Anda menginginkan nilainya dan Anda tahu kamus berisi kunci, katakan:
Tetapi jika, seperti biasanya terjadi, Anda tidak tahu itu berisi kunci - Anda ingin mengambil dan menggunakannya, tetapi hanya jika ada - maka gunakan sesuatu seperti
if let
:sumber
Saya sarankan Anda menyimpan hasil pencarian dalam variabel temp, menguji apakah variabel temp adalah nil dan kemudian menggunakannya. Dengan begitu Anda tidak melihat objek yang sama dua kali:
sumber
Seperti yang disarankan Adirael
objectForKey
untuk memeriksa keberadaan kunci tetapi ketika Anda memanggilobjectForKey
dalam kamus nullable, aplikasi jadi macet jadi saya memperbaiki ini dari mengikuti cara.}
sumber
sumber