如何检查一个NSDictionary或NSMutableDictionary是否包含一个键?

我需要检查一个字典是否有钥匙。 怎么样?

如果一个键不存在, objectForKey将返回nil。

 if ([[dictionary allKeys] containsObject:key]) { // contains key } 

要么

 if ([dictionary objectForKey:key]) { // contains object } 

Objective-C和Clang的更新版本有一个现代的语法:

 if (myDictionary[myKey]) { } 

您不必检查与nil的相等性,因为只有非零的Objective-C对象可以存储在字典(或数组)中。 所有Objective-C对象都是真值。 即使@0 @NO@0[NSNull null]评估为真。

编辑:斯威夫特现在是一件事情。

对于Swift,你会尝试像下面这样的东西

 if let value = myDictionary[myKey] { } 

如果myKey在字典中,那么这个语法将只执行if块,如果它是那么值存储在值variables中。 请注意,这适用于像0这样的错误值。

 if ([mydict objectForKey:@"mykey"]) { // key exists. } else { // ... } 

我喜欢费尔南德斯的答案,即使你问了两次。

这也应该做(与Martin's 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 } 

马丁和这个答案都适用于iPad2 iOS 5.0.1 9A405

使用JSON字典时:

 #define isNull(value) value == nil || [value isKindOfClass:[NSNull class]] if( isNull( dict[@"my_key"] ) ) { // do stuff } 

一个非常讨厌的gotcha只是浪费了一些时间debugging – 你可能会发现自动提示自动完成尝试使用doesContain似乎工作。

除了, doesContain使用id比较而不是由objectForKey使用的散列比较,所以如果你有一个带有string键的字典,它将返回NO到一个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 

使用Swift,它将是:

 if myDic[KEY] != nil { // key exists } 

是。 这种错误是非常普遍的,导致应用程序崩溃。 所以我使用在每个项目中添加NSDictionary如下:

//.h文件代码:

  @interface NSDictionary (AppDictionary) - (id)objectForKeyNotNull : (id)key; @end 

//.m文件代码如下

 #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 

在代码中你可以使用如下:

  NSStrting *testString = [dict objectForKeyNotNull:@"blah"]; 

在NSDictionary中检查密钥的存在:

 if([dictionary objectForKey:@"Replace your key here"] != nil) NSLog(@"Key Exists"); else NSLog(@"Key not Exists"); 

因为nil不能存储在Foundation数据结构中NSNull有时候代表一个nil 。 因为NSNull是一个单例对象,你可以通过使用直接指针比较来检查NSNull是否存储在字典中的值:

 if ((NSNull *)[user objectForKey:@"myKey"] == [NSNull null]) { } 

我build议你将查找的结果存储在一个临时variables,testing如果临时variables是零,然后使用它。 这样,你不会看起来相同的对象两次:

 id obj = [dict objectForKey:@"blah"]; if (obj) { // use obj } else { // Do something else } 
 if ([MyDictionary objectForKey:MyKey]) { // "Key Exist" } 

Swift 3.0

 if (dictionary.allKeys as NSArray).contains(key) { // contains key }