【问题标题】:Cocoa/Objective-C - Verify if a key exist on a NSDictionary [duplicate]Cocoa/Objective-C - 验证密钥是否存在于 NSDictionary [重复]
【发布时间】:2012-10-16 22:48:27
【问题描述】:

如何验证NSDictionary 上是否存在密钥?

我知道如何验证它是否有一些内容,但我很想验证它是否存在,因为它是动态的,我必须阻止它。就像在某些情况下,它可能碰巧有一个带有“名称”的键并且是值,但在另一些情况下,这对值可能不存在。

【问题讨论】:

    标签: ios objective-c cocoa nsdictionary


    【解决方案1】:

    最简单的方法是:

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

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

    编辑:对布拉德利的回答发表评论的回答

    你进一步问:

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

    在Objective-C中可以给nil发消息,不会报错,返回nil,所以扩展上面的简单方法就可以了:

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

    如果键序列的任何部分不存在,LHS 将返回 nil

    【讨论】:

    • 对于链式查找,也可以使用KVC:[contactDetailsDictionary valueForKeyPath:@"professional.CurrentJob.Role"]
    • 第一行代码有个小错别字,方法名是objectForKey,不是objectForkey
    【解决方案2】:

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

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

    【讨论】:

    • 有没有办法验证:[[[contactDetailsDictionary objectForKey:@"professional"] objectForKey:@"CurrentJob"]objectForKey:@"Role"]] 是否存在?不是一个键,因为它是一个非常大的字典,所以它可以存在于另一个类别中。
    • 用返回NSDictionary的方法调用替换dictionary
    • 如果方法返回相同的东西,那有什么需要呢?也许这是一个菜鸟问题,但我来自前端,目标 C 正在慢慢杀死我:P
    • 我明白你的意思。是的,您可以将值分配给字典变量并保持if 条件相同。
    • 那个回复太糟糕了。很难想象你怎么能以更低效的方式做到这一点。多么浪费内存和 CPU 时间。
    猜你喜欢
    • 2011-06-05
    • 1970-01-01
    • 2020-08-27
    • 2017-12-26
    • 2014-05-25
    • 2021-06-03
    • 2013-04-07
    • 2014-12-12
    • 1970-01-01
    相关资源
    最近更新 更多