如何获取 NSDictionary 中的第一个元素?

问题描述 投票:0回答:8

我有一个 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
8个回答
63
投票

[更新为使用

firstObject
,如另一个答案中所述,其优点是为空数组返回
nil
。]

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

id val = yourDict.allValues.firstObject;

(还有

lastObject
,从 10.0(!) 就已经存在了。)

(旧的,10.6 版本之前:)

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

25
投票

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

如果你想要任何物品,你可以获得其中一把钥匙:

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

7
投票

NSArray 有一个名为

firstObject
的选择器,它简化了代码并使其更具可读性:

id val = [[yourDict allValues] firstObject];

如果

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


3
投票

最简单:

[[dict objectEnumerator] nextObject];

2
投票

根据 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,因此我们不需要对字典实际为空的情况进行特殊处理。


2
投票

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

// dict 是 NSDictionary

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

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

[[dict allKeys]objectAtIndex:0];

0
投票

如果您有名为 messageNSDictionary, 非常简单:

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

但是您必须确保(或更好地检查)您的字典至少有一个元素。 检查方法如下:

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

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

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


-2
投票

试试这个:

NSDictionary *firstValue = [responseObject objectAtIndex:0];
© www.soinside.com 2019 - 2024. All rights reserved.