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

467

我需要检查一个字典中是否存在某个键。如何实现?


4
(仅供任何通过谷歌搜索到此处的人参考。请注意,这是一个非常旧的问题。下面SaintMacintosh的答案是最先进的技术,比这个QA提前了五年。希望能有所帮助。) - Fattie
1
实际上,Andy Dent的回答也提供了最新的状态和更多的上下文信息。而且比SaintMacintosh更早地完成了这一点。做个好事,向下滚动一点。 - Peter Kämpf
1
他使用:keysByName[test] != nil,!= nil 检查是多余的,并且在我看来不够可读。我只想为那些寻找语法的人分享一个 TL;DR 版本。 - Andrew Hoos
我同意@SaintMacintosh的观点。他的回答更加简洁明了。 - SAS
如果您想检查 NSDictionary 是否包含任何键(非特定),则应使用 [dictionary allKeys].count == 0。 如果 count0,则 NSDictionary 中没有键。 - Aleksander Azizi
16个回答

3

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

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

1
当我将NSMutableArray用作键的对象时,它没有起作用。 - pa12
4
这个东西为什么会被点赞?它完全是错误的。如果将单例的 NSNull 实例存储在字典中作为键值对 @"myKey" 的值,则此检查将返回 true。这与字典中不存在键 @"myKey" 是完全不同的事情 - 事实上这两者是互斥的。 - Mark Amery
由于这个错误的回答仍然有五个投票,我只能重复Mark的话:这段代码测试字典是否包含一个空值键,这与根本不包含该键完全不同。 - gnasher729
这是“完全错误的,但指向有趣的信息”。 - Fattie
这个答案已经被编辑以澄清它的功能(在字典中检查NSNull)和它不做的事情(在字典中检查一个值)。 - Andrew Hoos

2

解决方法:适用于Swift 4.2

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

//假设dict是一个字典
if dict.keys.contains("yourKey") {
//执行你的操作
}

let keyExists = dict[key] != nil

如果你想获取值,并且你已经知道了字典包含的键,则可以这样说:

Original Answer:最初的回答
let val = dict[key]!

但通常情况下,你并不知道它是否包含关键信息,你想要获取并使用它,但前提是它存在 - 那么可以使用类似于 if let 的方法:

最初的回答:

但如果像通常情况一样,您不知道它是否包含密钥 - 您想获取并使用它,但仅当它存在时 - 那么请使用类似于if let的内容。

if let val = dict[key] {
    // now val is not nil and the Optional has been unwrapped, so use it
}

1
我建议您将查找结果存储在临时变量中,测试临时变量是否为nil,然后再使用它。这样,您就不需要两次查找相同的对象:
id obj = [dict objectForKey:@"blah"];

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

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;

}


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

1
这实际上只是 这个现有答案 的重复。 - Pang

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

这是针对嵌套字典结构的


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接