цикл через 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своих значений. Имейте в виду, что это не гарантирует никакого порядка между звонками.


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
  }];

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 */
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.