如何检查一个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 }