цикл через NSMutableDictionary

Ответы:

211

Стандартный способ выглядел бы так

for(id key in myDict) {
    id value = [myDict objectForKey:key];
    [value doStuff];
}
Хенрик П. Хессель
источник
Если бы только был способ сделать что-то вроде: for (id key, value in myDict)это было бы идеально.
Луис Артола
4
Лучше перебирать ключи хотя (т.е. id key in myDict.allKeys), а не словарь. Это позволяет вам изменять словарь, что может быть именно тем, что вы хотите сделать.
Марсель Салате
29

ты можешь использовать

[myDict enumerateKeysAndObjectsUsingBlock: ^(id key, id obj, BOOL *stop) {
    // do something with key and obj
}];

если ваша целевая ОС поддерживает блоки.

Андрей Зверев
источник
22

Вы можете использовать [dict allValues]для получения NSArrayсвоих значений. Имейте в виду, что это не гарантирует никакого порядка между звонками.

jv42
источник
3
Я бы использовал это вместо (ключ id в словаре), особенно в изменяемом словаре, поскольку последний выдает неприятную ошибку, если словарь изменяется во время перечисления.
sigsegv
«это не гарантирует» - это часто требуется (у большинства языков есть версия словаря, которая ДЕЙСТВИТЕЛЬНО гарантирует порядок) - сохраняет ли он порядок на практике ?
Адам
@Adam В MacOS X у меня был довольно перепутанный порядок (не порядок вставки, не алфавитный, ничего), но согласованный между вызовами.
jv42
Зачем использовать NSDictionary, если сопоставления не имеют значения?
Стивен
2
@stephen Обычно это где-то имеет значение, а не где-то еще. Вы также получаете ограничение уникального ключа, которое может быть полезно в некоторых случаях.
jv42
4
  1. Для простого цикла быстрое перечисление немного быстрее, чем цикл на основе блоков
  2. Проще выполнять параллельное или обратное перечисление с помощью перечисления на основе блоков, чем с помощью быстрого перечисления. значение в отдельном сообщении отправить

в быстром переборе

for(id key in myDictionary) {
   id value = [myDictionary objectForKey:key];
  // do something with key and obj
}

в блоках:

[myDictionary enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {

   // do something with key and obj
  }];
user3540599
источник
3

Вам не нужно присваивать значение переменной. Вы можете получить к нему доступ напрямую с помощью myDict[key].

    for(id key in myDict) {
        NSLog(@"Key:%@ Value:%@", key, myDict[key]);
    }
Александр
источник
2

Другой способ - использовать Dicts Enumerator. Вот пример кода от Apple:

NSEnumerator *enumerator = [myDictionary objectEnumerator];
id value;

while ((value = [enumerator nextObject])) {
    /* code that acts on the dictionary’s values */
}
Хендрик
источник