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

我需要检查字典是否有钥匙。如何?

257779 次浏览

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

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

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

我建议您将查找结果存储在一个临时变量中,测试临时变量是否为nil,然后使用它。这样你就不会重复查找同一个对象:

id obj = [dict objectForKey:@"blah"];


if (obj) {
// use obj
} else {
// Do something else
}

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

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

我喜欢费尔南德斯的回答,尽管你问了两次obj。

这也应该(或多或少与马丁的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

是的。这类错误非常常见,会导致应用程序崩溃。所以我使用添加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"];

一个非常严重的问题,只是浪费了我调试的时间-你可能会发现自动完成提示自己尝试使用doesContain,这似乎是有效的。

不过,doesContain使用id比较,而不是objectForKey使用的散列比较,因此如果你有一个包含字符串键的字典,它将返回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

Objective-C和Clang的最新版本对此有了现代语法:

if (myDictionary[myKey]) {


}

你不需要检查是否与nil相等,因为只有非nil的Objective-C对象可以存储在字典(或数组)中。所有Objective-C对象都是真值。甚至@NO@0[NSNull null]的值也为true。

编辑:霉霉现在很火。

对于Swift,您可以尝试以下内容

if let value = myDictionary[myKey] {


}

此语法只在myKey在dict中时执行if块,如果在则值存储在value变量中。请注意,这甚至适用于假值,如0。

使用Swift,它将是:

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

当使用JSON字典时:

#define isNull(value) value == nil || [value isKindOfClass:[NSNull class]]


if( isNull( dict[@"my_key"] ) )
{
// do stuff
}

在NSDictionary中检查key是否存在:

if([dictionary objectForKey:@"Replace your key here"] != nil)
NSLog(@"Key Exists");
else
NSLog(@"Key not Exists");
if ([MyDictionary objectForKey:MyKey]) {
// "Key Exist"
}

正如Adirael建议objectForKey检查键是否存在,但当你在可空字典中调用objectForKey时,应用程序会崩溃,所以我从以下方式修复了这个问题。

- (instancetype)initWithDictionary:(NSDictionary*)dictionary {
id object = dictionary;


if (dictionary && (object != [NSNull null])) {
self.name = [dictionary objectForKey:@"name"];
self.age = [dictionary objectForKey:@"age"];
}
return self;

swift 4.2解决方案

所以,如果你只想回答这个问题,字典是否包含键,问:

let keyExists = dict[key] != nil

如果你想要这个值,并且你知道字典中包含这个键,那么说:

let val = dict[key]!

但是,如果像通常发生的那样,你不知道它包含键-你想获取它并使用它,但前提是它存在-那么使用类似if let的东西:

if let val = dict[key] {
// now val is not nil and the Optional has been unwrapped, so use it
}
if ( [dictionary[@"data"][@"action"] isKindOfClass:NSNull.class ] ){
//do something if doesn't exist
}

这是针对嵌套的字典结构