使用快速枚举和NSDictionary,不能保证按键的顺序迭代 - 我怎样才能按顺序进行迭代?

时间:2013-07-31 01:21:16

标签: ios objective-c nsdictionary for-in-loop fast-enumeration

我正在与一个API进行通信,该API将NSDictionary作为响应发送回我的应用所需的数据(数据基本上是一个提要)。此数据按最新到最旧排序,最新项目位于NSDictionary的前面。

当我用for (NSString *key in articles) { ... }快速枚举它们时,顺序似乎是随机的,因此我操作它们的顺序不是从最新到最旧,就像我想要的那样,而是完全随机的

我已经读过了,当使用NSDictionary快速枚举时,不能保证按顺序迭代通过数组。

然而,我需要它。如何按NSDictionary所在的顺序迭代NSDictionary?

4 个答案:

答案 0 :(得分:21)

一种方法是将所有密钥放在一个可变数组中:

NSMutableArray *allKeys = [[dictionary allKeys] mutableCopy];

然后根据您的需要对数组进行排序:

[allKeys sortUsingComparator: ....,]; //or another sorting method

然后你可以迭代数组(我认为这里使用快速枚举保持顺序),并获取当前键的字典值:

for (NSString *key in allKeys) {
   id object = [dictionary objectForKey: key];
   //do your thing with the object 
 }

答案 1 :(得分:9)

根据定义,词典是无序的。如果要对按键应用订单,则需要对按键进行排序。

NSArray *keys = [articles allKeys];
NSArray *sortedKeys = [keys sortedArrayUsingSelector:@selector(compare:)];
for (NSString *key in sortedKeys) {
    // process key
}

更新按键排序方式以满足您的需求。

答案 2 :(得分:4)

您也可以直接枚举如下:

NSMutableDictionary *xyz=[[NSMutableDictionary alloc] init];

for (NSString* key in xyz) {
    id value = [xyz objectForKey:key];
    // do stuff
} 


这取自zneak在问题中提供的答案:for each loop in objective c for accessing NSMutable dictionary

答案 3 :(得分:3)

正如其他人所说,你无法保证NSDictionary的订单。有时候订购allKeys的房产并不是你真正想要的。如果你真正想要的是通过你的密钥插入你的dict的顺序来枚举你的dict,你可以创建一个新的NSMutableArray属性/变量来存储你的密钥,这样它们就会保留它的顺序。

每当您在dict中插入一个新密钥时,将其插入到您的数组中:

[articles addObject:someArticle forKey:@"article1"];
[self.keys addObject:@"article1"];

按顺序枚举它们,只需:

for (NSString *key in self.keys) {
   id object = articles[key];
}