для каждого цикла в Objective C для доступа к словарю NSMutable

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

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

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

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

В PHP это очень легко, что-то следующим образом:

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

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

261
задан Cœur 26 June 2019 в 02:21
поделиться

5 ответов

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

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

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

647
ответ дан 23 November 2019 в 02:34
поделиться

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

4
ответ дан 23 November 2019 в 02:34
поделиться

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

1
ответ дан 23 November 2019 в 02:34
поделиться

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

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

2
ответ дан 23 November 2019 в 02:34
поделиться

Просто чтобы не оставлять 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);
}];
97
ответ дан 23 November 2019 в 02:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: