NSDictionary - Perlu memeriksa apakah kamus berisi pasangan nilai kunci atau tidak

96

Saya hanya perlu menanyakan sesuatu sebagai berikut. Misalkan saya memiliki kamus.

NSMutableDictionary *xyz=[[NSMutableDictionary alloc] init];
[xyz setValue:@"sagar" forKey:@"s"];
[xyz setValue:@"amit" forKey:@"a"];
[xyz setValue:@"nirav" forKey:@"n"];
[xyz setValue:@"abhishek" forKey:@"a"];
[xyz setValue:@"xrox" forKey:@"x"];

Sekarang, saya perlu memeriksa sebagai berikut

[xyz tidak berisi nilai kunci "b" ?? berpasangan atau tidak?

Pertanyaannya adalah Bagaimana?

Pertanyaan lainnya adalah Bagaimana cara menghitung total pasangan nilai kunci?

Katakanlah misalnya NSInteger mCount=[xyz keyCounts];

Sagar R. Kothari
sumber

Jawaban:

193

Tanyakan saja untuk objectForKey:@"b". Jika kembali nil, tidak ada objek yang disetel pada kunci itu.

if ([xyz objectForKey:@"b"]) {
    NSLog(@"There's an object set for key @\"b\"!");
} else {
    NSLog(@"No object set for key @\"b\"");
}

Edit : Untuk pertanyaan kedua yang Anda edit, itu sederhana NSUInteger mCount = [xyz count];. Kedua jawaban ini didokumentasikan dengan baik dan mudah ditemukan di referensi kelas NSDictionary ( [1] [2] ).

Matt B.
sumber
+1 Faktanya, dokumentasi langsung mengatakan ini: developer.apple.com/mac/library/documentation/Cocoa/Reference/…
Dave DeLong
6
Bagaimana jika kuncinya ada dalam kamus dan nilainya 0? Bukankah kita secara keliru mengira bahwa kuncinya sama sekali tidak ada dalam kamus?
jbx72487
13
@ jbx72487 Kamus harus berisi objek; objectForKey:mengembalikan sebuah id- pointer ke objek Objective-C. Jika Anda menyimpan nomor, nomor tersebut harus "dikotakkan" menjadi NSNumber . Bahkan jika NSNumber adalah nol atau salah itu akan tetap menjadi penunjuk yang valid dan kode di atas akan mendeteksi keberadaan secara akurat.
Matt B.
tidak bekerja dengan saya itu mengembalikan yang berikut: Menghentikan aplikasi karena pengecualian yang tidak tertangkap 'NSInvalidArgumentException', reason: '- [__ NSSingleObjectArrayI objectForKey:]: pemilih tidak dikenal dikirim ke instance 0x60000133a1c0'
Amr Marah
2

Dengan sintaks literal Anda dapat memeriksa sebagai berikut

static const NSString* kKeyToCheck = @"yourKey"
if (xyz[kKeyToCheck])
  NSLog(@"Key: %@, has Value: %@", kKeyToCheck, xyz[kKeyToCheck]);
else
 NSLog(@"Key pair do not exits for key: %@", kKeyToCheck); 
hariszaman
sumber