NSDictionary порядок ключей и значений

Я знаю что в NSDictionary, нет никаких гарантий о порядке пунктов при перечислении.

Однако можно ли ожидать, что [[myDictionary allValues] objectAtIndex:index] всегда будет соответствующее значение ключа [[myDictionary allKeys] objectAtIndex:index]? (предположим, что словарь является неизменным).

1 ответ

Решение

Даже если есть очень хороший шанс, что эти два будут в одном и том же порядке, Apple может изменить его в любое время, потому что просто нет гарантии заказа.

Если вам нужно два NSArrays, один с ключами и один со значениями, с "параллельными" индексами, лучшим подходом к этому было бы создание этих массивов самостоятельно путем перечисления пар ключ-значение словаря и добавления их к двум создаваемым массивам:

NSMutableArray *keys = [NSMutableArray array];
NSMutableArray *vals = [NSMutableArray vals];
[dict enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
    [keys addObject:key];
    [vals addObject:obj];
}];

Вы также можете получить ключи отдельно, а затем получить значения в массиве с параллельной индексацией, вызвав objectsForKeys:notFoundMarker: метод:

NSArray *keys = [dict allKeys];
// In the call below, the marker [NSNull null] will not be used, because we know
// that all keys will be present in the dictionary.
NSArray *vals = [dict objectsForKeys:keys notFoundMarker:[NSNull null]];
Другие вопросы по тегам