Cocoa/Objective-C - 如何验证NSDictionary中是否存在某个键(key)

14

我该如何验证一个NSDictionary中是否存在一个键?

我知道如何验证它是否有一些内容,但我想要验证它是否存在,因为它是动态的,我必须防止它。例如,在某些情况下,可能会有一个带有“name”和其值的键,而在另一些情况下,可能会发生这种值对不存在的情况。

2个回答

25

最简单的方法是:

[dictionary objectForKey:@"key"] != nil

由于字典在返回不存在的键时会返回 nil(因此您不能在字典中存储 nil,要使用 NSNull),

编辑:回复 Bradley 的评论

您进一步询问:

有没有办法验证这个存在:[[[contactDetailsDictionary objectForKey:@"professional"] objectForKey:@"CurrentJob"] objectForKey:@"Role"]?不是单个键,因为它是一个非常庞大的字典,所以它可能存在于另一个类别中。

在 Objective-C 中,您可以向 nil 发送消息,这不是错误并返回 nil。因此,扩展以上简单方法,您只需编写:

[[[contactDetailsDictionary objectForKey:@"professional"] 
                              objectForKey:@"CurrentJob"] 
                                objectForKey:@"Role"] != nil

如果密钥序列的任何部分不存在,则左侧将返回nil


1
对于链式查找,您也可以使用KVC:[contactDetailsDictionary valueForKeyPath:@"professional.CurrentJob.Role"] - Ken Thomases
代码的第一行有一个小错别字,方法名应该是 objectForKey 而不是 objectForkey - jamix

8

NSDictionary将所有的键作为NSArray返回,然后在该数组上使用containsObject方法。

NSDictionary* dictionary = [NSDictionary dictionaryWithObjectsAndKeys:@"object", @"key"];
if ([[dictionary allKeys] containsObject:@"key"]) {
  NSLog(@"'key' exists.");
}

有没有一种方法可以验证这个代码是否存在:[[[contactDetailsDictionary objectForKey:@"professional"] objectForKey:@"CurrentJob"]objectForKey:@"Role"]]?这不是单个键,因为它是一个非常大的字典,所以它可能存在于另一个类别中。 - fabio santos
用一个返回 NSDictionary 的方法调用替换 dictionary - Bradley M Handy
如果方法返回相同的东西,那么这样做有什么必要呢?也许这是一个新手问题,但我来自前端,而这个Objective C正在慢慢地折磨我 :P - fabio santos
我明白你的意思。是的,你可以将值分配给字典变量并保持“if”条件不变。 - Bradley M Handy
2
那个回复太糟糕了。很难想象你怎么能以更低效的方式完成这个任务。浪费了太多的内存和 CPU 时间。 - gnasher729

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