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

Dou*_*ith 13 objective-c nsdictionary fast-enumeration for-in-loop ios

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

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

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

但是,我需要它.如何按NSDictionary所在的顺序迭代NSDictionary?

Mar*_*rio 22

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

NSMutableArray *allKeys = [[dictionary allKeys] mutableCopy];
Run Code Online (Sandbox Code Playgroud)

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

[allKeys sortUsingComparator: ....,]; //or another sorting method
Run Code Online (Sandbox Code Playgroud)

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

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

  • 因为在那之后allKeys数组被排序.这是唯一可能的a)使它成为一个可变数组或b)创建另一个,排序的数组(如在rmaddys答案中).这是偏好的选择,任何东西都和其他东西一样好.但很高兴评论这个2岁,接受的答案;) (2认同)

rma*_*ddy 9

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

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

更新密钥的排序方式以满足您的需求.