Подтвердить что ты не робот

С быстрым перечислением и NSDictionary, итерация в порядке ключей не гарантируется - как я могу сделать так, чтобы она была в порядке?

Я общаюсь с API, который отправляет NSDictionary в качестве ответа с данными, которые нужны моему приложению (данные в основном являются фидом). Эти данные сортируются от самых старых до самых старых, с новейшими элементами в начале NSDictionary.

Когда я быстро перечисляю их с помощью for (NSString *key in articles) { ... }, порядок кажется случайным, и, следовательно, порядок, который я им нахожу, не в порядке от самого нового до самого старого, как я хочу, но полностью случайного.

Я прочитал, и при использовании быстрого перечисления с NSDictionary не гарантируется итерация по порядку через массив.

Однако мне это нужно. Как заставить его перебирать NSDictionary в порядке, в котором находится NSDictionary?

4b9b3361

Ответ 1

Один способ может состоять в том, чтобы получить все ключи в изменяемом массиве:

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 
 }

Ответ 2

Словари по определению неупорядочены. Если вы хотите применить заказ к ключам, вам необходимо отсортировать ключи.

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

Обновите способ сортировки ключей в соответствии с вашими потребностями.

Ответ 4

Как говорили другие люди, вы не можете гарантировать порядок в 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];
}