для каждого цикла в Objective-C для доступа к словарю NSMutable
Мне трудно найти доступ к изменяемым клавишам и значениям словаря в Objective-C.
Предположим, что у меня есть это:
NSMutableDictionary *xyz=[[NSMutableDictionary alloc] init];
Я могу установить ключи и значения. Теперь я просто хочу получить доступ к каждому ключу и значению, но я не знаю, сколько ключей установлено.
В PHP это очень просто, что-то вроде:
foreach ($xyz as $key => $value)
Как это возможно в Objective-C?
Ответы
Ответ 1
for (NSString* key in xyz) {
id value = xyz[key];
// do stuff
}
Это работает для каждого класса, который соответствует протоколу NSFastEnumeration (доступен на 10. 5+ и iOS), хотя NSDictionary
является одной из немногих коллекций, которая позволяет перечислять ключи вместо значений. Я предлагаю вам прочитать о быстром перечислении в теме программирования коллекций.
О, я должен добавить, однако, что вы НИКОГДА не должны изменять коллекцию при ее перечислении.
Ответ 2
Просто чтобы не оставить параметр 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);
}];
Ответ 3
Если вам нужно мутировать словарь при перечислении:
for (NSString* key in xyz.allKeys) {
[xyz setValue:[NSNumber numberWithBool:YES] forKey:key];
}
Ответ 4
Я предлагаю вам прочитать часть " Перечисление: обход элементов коллекций" в Руководстве по программированию коллекций для cocoa. Существует пример кода для ваших нужд.
Ответ 5
Самый простой способ перечислить словарь -
for (NSString *key in tDictionary.keyEnumerator)
{
//do something here;
}
где tDictionary
- это NSDictionary
или NSMutableDictionary
, которые вы хотите итерации.
Ответ 6
Быстрое перечисление было добавлено в 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" ...
}
Вы не освобождаете объект перечисления, и вы не можете reset его. Если вы хотите начать сначала, вам нужно попросить новый объект перечислителя из словаря.
Ответ 7
Вы можете использовать -[NSDictionary allKeys]
для доступа ко всем клавишам и прокручивать его.