переглядаючи NSMutableD Dictionary


Відповіді:


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), а не через словник. Це дозволяє вимкнути словник, що може бути тим, що ви хочете зробити.
marcel salathe

29

ви можете використовувати

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

якщо ваша цільова ОС підтримує блоки.


22

Ви можете використовувати, [dict allValues]щоб отримати одне NSArrayзі своїх значень. Зауважте, що це не гарантує жодного порядку між дзвінками.


3
Я б використав цей за допомогою (ключа ідентифікатора у словнику), особливо на змінному словнику, оскільки останній видає неприємну помилку, якщо словник модифікується під час перерахування.
sigsegv

"це не гарантує" - це часто потрібно (більшість мов мають версію словника, який НЕ гарантує порядок) - чи на практиці це зберігає порядок?
Адам

@Adam У MacOS X у мене був досить змішаний порядок (не порядок вставки, не алфавіт, нічого), але послідовний між дзвінками.
jv42

Навіщо використовувати NSDictionary, якщо відображення не мають значення?
Стефан

2
@stephen Зазвичай це має значення десь, а не деінде. Ви також отримуєте унікальне обмеження ключа, яке може бути корисним у деяких випадках.
jv42

4
  1. Для простого циклу швидке перерахування трохи швидше, ніж цикл на основі блоку
  2. Простіше зробити паралельне чи зворотне перерахування з переліком на основі блоків, ніж із швидким переліченням. Під час циклу за допомогою NSDictionary ви можете отримати ключ і значення в одному зверненні за допомогою перечислювача на основі блоків, тоді як при швидкому переліченні вам потрібно використовувати ключ для отримання значення в окремому відправленні повідомлення

у швидкому перерахуванні

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

Інший спосіб - використовувати перелік дикторів. Ось приклад коду від 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.