для каждого цикла в objective c для доступа к nsmutable словарю
Я нахожу некоторые трудности в доступе к изменяемым ключам словаря и значениям в Objective-C.
Предположим, у меня есть это:
NSMutableDictionary *xyz=[[NSMutableDictionary alloc] init];
Я могу установить ключи и значения. Теперь я просто хочу получить доступ к каждому ключу и значению, но я не знаю, сколько ключей установлено.
в PHP это очень просто, что-то вроде:
foreach ($xyz as $key => $value)
Как это возможно в Objective-C?
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]
для доступа ко всем ключам и петли через него.