【问题标题】:Find Existence of Key in NSDictionary在 NSDictionary 中查找键的存在
【发布时间】:2012-08-30 08:12:26
【问题描述】:

我们如何识别对象是否可用于特定键。我试过以下:

for(NSDictionary *item in jsonArray){
if([item objectForKey:@"EventDate"])
        NSLog([item objectForKey:@"EventDate"]);
}

这导致代码崩溃并出现错误:

  -[__NSCFString objectForKey:]: unrecognized selector sent to instance 0x6a567b0

我还发现许多帖子显示objectForKey 如果密钥不存在,将返回nil。我的问题是NSDictionary 类中还有一个方法是“setNilValueForKey”。这怎么可能我们不能用 nil 对象指定 NSDictionary 键,而且我们有方法为 NSDictionary 中的对象设置 nil 值。

请先提出建议,并在第二次查询时让我清楚。

【问题讨论】:

    标签: iphone objective-c nsdictionary nsmutabledictionary


    【解决方案1】:

    1) 您的 jsonArray 包含除NSDictionaries 之外的其他类型的对象,包括至少一个NSStringNSString 不响应 objectForKey: 所以当你尝试调用它时它会抛出异常。您必须查看 JSON 以确定如何继续您正在执行的操作。

    2) 有一个NSObject 方法setNilValueForKey: 与key-value 编码有关。这与NSDictionary 无关。如果您确实需要在字典中表示 nil,请将 [NSNull null] 设置为表示 nil 的键的对象。

    希望这会有所帮助!

    【讨论】:

    • 感谢您的回复 1. 当我们拥有具有指定键的对象时,它可以正常工作。 2.如果是这种情况,我也尝试过这种情况,例如 if([[item objectForKey:@""]isEqual:[NSNull null]])。它也崩溃了。
    • 那么什么对象导致了崩溃呢?
    • 您已经为这两个查询提供了正确的建议。更改数组响应有效。
    【解决方案2】:

    并非数组中的所有对象都是字典。在处理之前,您需要检查您正在处理的数据类型。像这样的:

    for(NSObject* item in jsonArray) {
      if ([item isKindOfClass:[NSDictionary class]]) {
        // do dictionary stuff
      }
      else if ([item isKindOfClass:[NSString class]]) {
        // do string stuff
      }
    }
    

    【讨论】:

      【解决方案3】:

      item 不是一个 NSDictionary 它是一个字符串。所以检查你的 jsonArray 它可能只包含字符串而不是字典

      【讨论】:

      • 当我们用各自的键获得价值时,它工作得很好。当我们没有具有指定键的对象时,它只是崩溃。
      【解决方案4】:

      回答第二个问题

      有一个名为 NSNull 的非 nil 对象专门用于在“普通” nil 不可接受的情况下表示 nil。如果你用 [NSNull null] 对象替换你的 nil,NSDictionary 将采用它们。不过,您需要在退出时检查 NSNull。

      参考更多here

      第一次查询的答案

      for(id *item in jsonArray)
      {
        if([item isKindofClass:[NSDictionary class])
        {
          NSArray *allKeys = [item allKeys];
          for(NSString *strKey in allKeys)
          {
           if([strKey isEqualToString:@"EventDate"])
           {
             // EventDate key has object
             NSLog([item objectForKey:@"EventDate"]);
           }
          }
        }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-27
        • 1970-01-01
        • 2014-01-20
        • 2010-12-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多