如何检查NSDictionary或NSMutableDictionary是否包含密钥?

时间:2010-05-06 21:27:52

标签: objective-c foundation

我需要检查dict是否有密钥。怎么样?

16 个答案:

答案 0 :(得分:756)

如果密钥不存在,

objectForKey将返回nil。

答案 1 :(得分:162)

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

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

答案 2 :(得分:97)

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

if (myDictionary[myKey]) {

}

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

编辑:Swift现在是一件事。

对于Swift,你会尝试类似下面的内容

if let value = myDictionary[myKey] {

}

如果myKey在dict中,则此语法仅执行if块,如果是,则值将存储在value变量中。请注意,这适用于0等虚假值。

答案 3 :(得分:22)

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

答案 4 :(得分:9)

使用JSON词典时:

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

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

答案 5 :(得分:8)

我喜欢费尔南德斯的回答,即使你要求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
}

Martin's和这个答案都适用于iPad2 iOS 5.0.1 9A405

答案 6 :(得分:5)

是。这种错误很常见,导致应用程序崩溃。所以我用来在每个项目中添加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"];

答案 7 :(得分:5)

一个非常讨厌的问题,只是浪费了我的一些时间调试 - 你可能会发现自己通过自动完成提示尝试使用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

答案 8 :(得分:4)

使用Swift,它将是:

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

答案 9 :(得分:3)

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

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

答案 10 :(得分:3)

用于检查NSDictionary中密钥的存在:

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

答案 11 :(得分:2)

快速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
}

答案 12 :(得分:1)

我建议你将查询结果存储在temp变量中,测试temp变量是否为nil然后使用它。这样你就不会两次看同一个物体了:

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

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

答案 13 :(得分:1)

正如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;

}

答案 14 :(得分:0)

if ([MyDictionary objectForKey:MyKey]) {
      // "Key Exist"
} 

答案 15 :(得分:0)

if ( [dictionary[@"data"][@"action"] isKindOfClass:NSNull.class ] ){
   //do something if doesn't exist
}

这是用于嵌套字典结构的