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
15 回答
如果密钥不存在,
objectForKey
将返回nil .要么
更新的Objective-C和Clang版本具有现代语法:
您不必检查与nil的相等性,因为只有非零的Objective-C对象可以存储在字典(或数组)中 . 并且所有Objective-C对象都是真实的值 . 甚至
@NO
,@0
和[NSNull null]
评估为真 .编辑:斯威夫特现在是一个东西 .
对于Swift,你会尝试类似下面的内容
如果myKey在dict中,则此语法仅执行if块,如果是,则将值存储在value变量中 . 请注意,这适用于0等虚假值 .
使用JSON词典时:
我喜欢费尔南德斯的答案,即使你要求两次obj .
这也应该做(或多或少与马丁的A相同) .
Martin和这个答案都适用于iPad2 iOS 5.0.1 9A405
一个非常讨厌的问题,只是浪费了我的一些时间调试 - 你可能会发现自己提示自动完成尝试使用
doesContain
似乎工作 .除外,
doesContain
使用id比较而不是objectForKey
使用的哈希比较,所以如果你有一个带字符串键的字典,它将返回NO给doesContain
.是 . 这种错误很常见,导致应用程序崩溃 . 所以我用它在每个项目中添加NSDictionary,如下所示:
//.h文件代码:
//.m文件代码如下
在代码中,您可以使用如下:
使用Swift,它将是:
用于检查NSDictionary中密钥的存在:
因为nil不能存储在Foundation数据结构中
NSNull
有时代表nil
. 因为NSNull
是一个单例对象,您可以通过使用直接指针比较来检查NSNull
是否是存储在字典中的值:我建议你将查找结果存储在temp变量中,测试temp变量是否为nil然后使用它 . 这样你两次看起来不一样的对象:
正如Adirael建议
objectForKey
检查密钥存在但是当你在可空字典中调用objectForKey
时,应用程序崩溃所以我从以下方式修复了这个问题 .}
Solution for swift 4.2
因此,如果您只想回答字典是否包含密钥的问题,请询问:
如果您想要该值并且您知道字典包含密钥,请说:
但是,如果通常发生,你不知道它包含密钥 - 你想获取它并使用它,但只有它存在 - 然后使用像
if let
这样的东西: