如何获取 NSDictionary 中的第一个元素?
Posted
技术标签:
【中文标题】如何获取 NSDictionary 中的第一个元素?【英文标题】:How can I get the first element in an 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;
【问题讨论】:
【参考方案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,调用allKeys
或allValues
会产生创建新数组的成本:
一个包含字典值的新数组,或者一个空数组,如果 字典没有条目(只读)
因此,不产生此类费用的替代选项可能如下所示:
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】:如果您有名为 message 的 NSDictionary, 这很简单:
message[[[message allKeys] objectAtIndex:0]];
但您必须确定(或更好地检查)您的字典至少包含一个元素。 以下是您可以检查它的方法:
if ([message allKeys] > 0) NSLog(@"%@", message[[[message allKeys] objectAtIndex:0]]);
但是 NSDictionary 没有保证顺序,所以你可能应该只在你的字典只有一个元素时才使用这个代码。
[更新] 如果您需要获取字典的任何元素,使用它也是一个好主意
【讨论】:
【参考方案8】:试试这个:
NSDictionary *firstValue = [responseObject objectAtIndex:0];
【讨论】:
以上是关于如何获取 NSDictionary 中的第一个元素?的主要内容,如果未能解决你的问题,请参考以下文章