для каждого цикла в Objective-C для доступа к словарю NSMutable - PullRequest
257 голосов
/ 27 января 2010

Я нахожу некоторые трудности в доступе к изменяемым словарным ключам и значениям в Objective-C.

Предположим, у меня есть это:

NSMutableDictionary *xyz=[[NSMutableDictionary alloc] init];

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

В PHP это очень просто, что-то вроде следующего:

foreach ($xyz as $key => $value)

Как это возможно в Objective-C?

Ответы [ 7 ]

642 голосов
/ 27 января 2010
for (NSString* key in xyz) {
    id value = xyz[key];
    // do stuff
}

Это работает для каждого класса, который соответствует протоколу NSFastEnumeration (доступен в 10.5+ и iOS), хотя NSDictionary - одна из немногих коллекций, которая позволяет перечислять ключи вместо значений. Я предлагаю вам прочитать о быстром перечислении в теме программирования коллекций .

О, я должен добавить, однако, что вы НИКОГДА не должны изменять коллекцию при ее перечислении.

97 голосов
/ 27 января 2010

Только чтобы не пропускать опцию 10.6+ для перечисления ключей и значений с использованием блоков ...

[dict enumerateKeysAndObjectsUsingBlock:^(id key, id object, BOOL *stop) {
    NSLog(@"%@ = %@", key, object);
}];

Если вы хотите, чтобы действия происходили одновременно:

[dict enumerateKeysAndObjectsWithOptions:NSEnumerationConcurrent
                              usingBlock:^(id key, id object, BOOL *stop) {
    NSLog(@"%@ = %@", key, object);
}];
13 голосов
/ 04 июня 2013

Если вам нужно изменить словарь при перечислении:

for (NSString* key in xyz.allKeys) {
    [xyz setValue:[NSNumber numberWithBool:YES] forKey:key];
}
4 голосов
/ 17 декабря 2013

Самый простой способ перечислить словарь -

for (NSString *key in tDictionary.keyEnumerator) 
{
    //do something here;
}

где tDictionary - это NSDictionary или NSMutableDictionary, который вы хотите повторить.

4 голосов
/ 27 января 2010

Предлагаю прочитать Перечисление: обход элементов коллекции часть Руководства по программированию коллекций для какао . Существует пример кода для ваших нужд.

2 голосов
/ 27 января 2010

Быстрое перечисление было добавлено в 10.5 и в iPhone OS, и это значительно быстрее, а не только синтаксический сахар. Если вам нужно ориентироваться на более раннюю среду выполнения (т. Е. 10.4 и обратно), вам придется использовать старый метод перечисления:

NSDictionary *myDict = ... some keys and values ...
NSEnumerator *keyEnum = [myDict keyEnumerator];
id key;

while ((key = [keyEnum nextObject]))
{
    id value = [myDict objectForKey:key];
    ... do work with "value" ...
}

Вы не освобождаете объект перечислителя и не можете его сбросить. Если вы хотите начать все сначала, вам нужно запросить новый объект перечислителя из словаря.

1 голос
/ 27 января 2010

Вы можете использовать -[NSDictionary allKeys], чтобы получить доступ ко всем клавишам и просмотреть их.

...