13

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

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

我已经阅读过,当使用 NSDictionary 的快速枚举时,不能保证按顺序遍历数组。

但是,我需要它。如何让它按照 NSDictionary 所在的顺序遍历 NSDictionary?

4

3 回答 3

22

一种方法是获取可变数组中的所有键:

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 
 }
于 2013-07-31T01:27:33.747 回答
9

根据定义,字典是无序的。如果要对键应用顺序,则需要对键进行排序。

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

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

于 2013-07-31T01:23:38.820 回答
4

正如其他人所说,您不能保证 NSDictionary 中的订单。有时订购 allKeys 属性并不是您真正想要的。如果您真正想要的是按您的密钥插入到您的 dict 中的顺序枚举您的 dict,您可以创建一个新的 NSMutableArray 属性/变量来存储您的密钥,以便它们保留其顺序。

每次您将在字典中插入一个新键时,将其插入到您的数组中:

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

要按顺序枚举它们,只需执行以下操作:

for (NSString *key in self.keys) {
   id object = articles[key];
}
于 2013-07-31T01:31:04.473 回答