提问



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

最佳参考


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

其它参考1


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


要么


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

其它参考2


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


if (myDictionary[myKey]) {

}


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


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


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


if let value = myDictionary[myKey] {

}


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

其它参考3


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

其它参考4


使用JSON词典时:


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

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

其它参考5


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


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

其它参考7


使用Swift,它将是:


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

其它参考8


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

其它参考9


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


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

其它参考10


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


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

其它参考11


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


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

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

其它参考12


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

其它参考13


Swift 3.0


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