для каждого цикла в objective c для доступа к nsmutable словарю


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

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

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

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

в PHP это очень просто, что-то вроде:

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

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

7 252

7 ответов:

for (NSString* key in xyz) {
    id value = xyz[key];
    // do stuff
}

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

О, я должен добавить, однако, что вы должны никогда изменить сбор при перечислении через него.

просто чтобы не упустить опцию 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);
}];

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

for (NSString* key in xyz.allKeys) {
    [xyz setValue:[NSNumber numberWithBool:YES] forKey:key];
}

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

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

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

здесь tDictionary это NSDictionary или NSMutableDictionary вы хотите повторить.

быстрое перечисление было добавлено в 10.5 и в ОС iPhone, и это значительно быстрее, а не только синтаксический сахар. Если вы должны ориентироваться на более старую среду выполнения (т. е. 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" ...
}

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

можно использовать -[NSDictionary allKeys] для доступа ко всем ключам и петли через него.