我正在与一个API进行通信,该API将NSDictionary作为响应发送回我的应用所需的数据(数据基本上是一个提要)。此数据按最新到最旧排序,最新项目位于NSDictionary的前面。
当我用for (NSString *key in articles) { ... }
快速枚举它们时,顺序似乎是随机的,因此我操作它们的顺序不是从最新到最旧,就像我想要的那样,而是完全随机的
我已经读过了,当使用NSDictionary快速枚举时,不能保证按顺序迭代通过数组。
然而,我需要它。如何按NSDictionary所在的顺序迭代NSDictionary?
答案 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];
}