Saya perlu memeriksa apakah dict memiliki kunci atau tidak. Bagaimana?
NSDictionary
mengandung kunci (non-spesifik) Anda harus menggunakan [dictionary allKeys].count == 0
Jika count
ini 0
tidak ada kunci di NSDictionary
.
Saya perlu memeriksa apakah dict memiliki kunci atau tidak. Bagaimana?
NSDictionary
mengandung kunci (non-spesifik) Anda harus menggunakan [dictionary allKeys].count == 0
Jika count
ini 0
tidak ada kunci di NSDictionary
.
Jawaban:
objectForKey
akan mengembalikan nol jika kunci tidak ada.
[NSNull null]
sebagai gantinya.
if ([[dictionary allKeys] containsObject:key]) {
// contains key
}
atau
if ([dictionary objectForKey:key]) {
// contains object
}
Versi Objective-C dan Clang yang lebih baru memiliki sintaksis modern untuk ini:
if (myDictionary[myKey]) {
}
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
if let value = myDictionary[myKey] {
}
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.
if ([mydict objectForKey:@"mykey"]) {
// key exists.
}
else
{
// ...
}
Saat menggunakan kamus JSON:
#define isNull(value) value == nil || [value isKindOfClass:[NSNull class]]
if( isNull( dict[@"my_key"] ) )
{
// do stuff
}
Saya suka jawaban Fernandes meskipun Anda meminta keberatan dua kali.
Ini juga harus dilakukan (kurang lebih sama dengan Martin A).
id obj;
if ((obj=[dict objectForKey:@"blah"])) {
// use obj
} else {
// Do something else like creating the obj and add the kv pair to the dict
}
Martin dan jawaban ini berfungsi pada iPad2 iOS 5.0.1 9A405
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 oleh objectForKey
jadi jika Anda memiliki kamus dengan kunci string, ia akan mengembalikan TIDAK ke a doesContain
.
NSMutableDictionary* keysByName = [[NSMutableDictionary alloc] init];
keysByName[@"fred"] = @1;
NSString* test = @"fred";
if ([keysByName objectForKey:test] != nil)
NSLog(@"\nit works for key lookups"); // OK
else
NSLog(@"\nsod it");
if (keysByName[test] != nil)
NSLog(@"\nit works for key lookups using indexed syntax"); // OK
else
NSLog(@"\nsod it");
if ([keysByName doesContain:@"fred"])
NSLog(@"\n doesContain works literally");
else
NSLog(@"\nsod it"); // this one fails because of id comparison used by doesContain
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:
@interface NSDictionary (AppDictionary)
- (id)objectForKeyNotNull : (id)key;
@end
//.m kode file adalah seperti di bawah ini
#import "NSDictionary+WKDictionary.h"
@implementation NSDictionary (WKDictionary)
- (id)objectForKeyNotNull:(id)key {
id object = [self objectForKey:key];
if (object == [NSNull null])
return nil;
return object;
}
@end
Dalam kode Anda dapat menggunakan seperti di bawah ini:
NSStrting *testString = [dict objectForKeyNotNull:@"blah"];
Untuk memeriksa keberadaan kunci di NSDictionary:
if([dictionary objectForKey:@"Replace your key here"] != nil)
NSLog(@"Key Exists");
else
NSLog(@"Key not Exists");
Karena nil tidak dapat disimpan dalam struktur data Foundation NSNull
terkadang mewakili a nil
. Karena NSNull
adalah objek tunggal yang dapat Anda periksa untuk melihat apakah NSNull
nilai disimpan dalam kamus dengan menggunakan perbandingan pointer langsung:
if ((NSNull *)[user objectForKey:@"myKey"] == [NSNull null]) { }
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:
let keyExists = dict[key] != nil
Jika Anda menginginkan nilainya dan Anda tahu kamus berisi kunci, katakan:
let val = dict[key]!
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
:
if let val = dict[key] {
// now val is not nil and the Optional has been unwrapped, so use it
}
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:
id obj = [dict objectForKey:@"blah"];
if (obj) {
// use obj
} else {
// Do something else
}
Seperti yang disarankan Adirael objectForKey
untuk memeriksa keberadaan kunci tetapi ketika Anda memanggil objectForKey
dalam kamus nullable, aplikasi jadi macet jadi saya memperbaiki ini dari mengikuti cara.
- (instancetype)initWithDictionary:(NSDictionary*)dictionary {
id object = dictionary;
if (dictionary && (object != [NSNull null])) {
self.name = [dictionary objectForKey:@"name"];
self.age = [dictionary objectForKey:@"age"];
}
return self;
}
if ([MyDictionary objectForKey:MyKey]) {
// "Key Exist"
}