【问题标题】:How can I get the first element in an NSDictionary?如何获取 NSDictionary 中的第一个元素?
【发布时间】:2010-04-22 22:42:45
【问题描述】:

我有一个 NSDictionaries 数组。如何提取字典中的第一个元素?

   NSArray *messages = [[results objectForKey:@"messages"] valueForKey:@"message"];         
    for (NSDictionary *message in messages)
    {
        STObject *mySTObject = [[STObject alloc] init];
        mySTObject.stID = [message valueForKey:@"id"];      
        stID = mySTObject.stID;
    }

【问题讨论】:

    标签: iphone objective-c cocoa cocoa-touch nsdictionary


    【解决方案1】:

    NSDictionary 中没有“第一个”元素;它的成员没有保证的顺序。如果您只想要字典中的 一个 对象,但不关心它与哪个键关联,您可以这样做:

    id val = nil;
    NSArray *values = [yourDict allValues];
    
    if ([values count] != 0)
        val = [values objectAtIndex:0];
    

    【讨论】:

    • 是的,所以如果[values count] 为零,您仍然可以向val 发送消息而不会崩溃。
    • 请注意allValues 方法返回一个无序数组。根据文档“未定义数组中值的顺序。”。所以你可能得不到你期望得到的对象。
    • 你也可以使用下标。 val = values[0]; 是合法的。更多关于下标的信息:clang.llvm.org/docs/ObjectiveCLiterals.html
    • allValues 不保证订单。
    【解决方案2】:

    NSDictionaries 是无序的,这意味着没有第一个或最后一个元素。事实上,即使在特定字典的生命周期内,也不能保证键的顺序是相同的。

    如果你想要任何对象,你可以得到其中一个键:

    id key = [[message allKeys] objectAtIndex:0]; // Assumes 'message' is not empty
    id object = [message objectForKey:key];
    

    【讨论】:

    • 谢谢 - 这是有道理的。
    【解决方案3】:

    NSArray 有一个名为 firstObject 的选择器,它简化了代码并使其更具可读性:

    id val = [[yourDict allValues] firstObject];
    

    如果yourDict 为空val 将是nil,因此无需检查字典/数组大小。

    【讨论】:

    • 虽然这是真的,并且可以节省一两行代码,但问题是关于NSDictionary,而不是NSArray
    • 是的,并且是您使用此代码获得的字典的“第一个”值。只是它使用数组转换,就像几乎所有其他答案一样。
    • 字典没有“第一”,因为它没有顺序。每次向字典中添加对象时,您可能会得到不同的“第一”。
    • 当然,字典不是数组,上面没有隐含的顺序。但用户并没有要求数据的特定顺序。
    【解决方案4】:

    最简单的:

    [[dict objectEnumerator] nextObject];
    

    【讨论】:

      【解决方案5】:

      根据Apple,调用allKeysallValues 会产生创建新数组的成本:

      一个包含字典值的新数组,或者一个空数组,如果 字典没有条目(只读)

      因此,不产生此类费用的替代选项可能如下所示:

      NSString* key = nil;
      for(key in yourDict)
      { // this loop will not execute if the dictionary is empty
         break; // exit loop as soon as we enter it (key will be set to some key)
      }
      id object = yourDict[key]; // get object associated with key. nil if key doesn't exist.
      

      注意:如果字典为空,则key保持为nil,返回的对象也为nil,因此我们不需要对字典为空的情况进行特殊处理。

      【讨论】:

        【解决方案6】:

        如果有人仍在寻找此类情况的答案,则可以参考:

        // dict 是 NSDictionary

        // [dict allKeys] 将给出 dict 中的所有键存在

        // [[dict allKeys]objectAtIndex:0] 将从索引 0 处的所有键对象中给出,因为 [dict allKeys] 返回一个数组。

        [[dict allKeys]objectAtIndex:0];
        

        【讨论】:

          【解决方案7】:

          如果您有名为 messageNSDictionary, 这很简单:

          message[[[message allKeys] objectAtIndex:0]];
          

          但您必须确定(或更好地检查)您的字典至少包含一个元素。 以下是您可以检查它的方法:

          if ([message allKeys] > 0) NSLog(@"%@", message[[[message allKeys] objectAtIndex:0]]);
          

          但是 NSDictionary 没有保证顺序,所以你可能应该只在你的字典只有一个元素时才使用这个代码。

          [更新] 如果您需要获取字典的任何元素,使用它也是一个好主意

          【讨论】:

            【解决方案8】:

            试试这个:

            NSDictionary *firstValue = [responseObject objectAtIndex:0];
            

            【讨论】:

              猜你喜欢
              • 2012-06-22
              • 2014-09-08
              • 2022-06-14
              • 2021-12-08
              • 2012-08-21
              • 1970-01-01
              • 1970-01-01
              • 2012-05-08
              • 2011-05-04
              相关资源
              最近更新 更多