Перечисление по NSMutableDictionary - не может получить доступ к свойствам объекта из цикла - PullRequest
3 голосов
/ 17 октября 2011

У меня есть NSMutableDictionary, analyzedPxDictionary, содержащий набор объектов Pixel (пользовательский класс, который я создал). Среди прочего, объекты Pixel содержат свойство NSArray с именем rgb. Этот массив всегда будет содержать три объекта NSNumber с целочисленными значениями, соответствующими значениям rgb пикселя.

Я сейчас пытаюсь перечислить более analyzedPxDictionary, используя быстрое перечисление. Однако кажется, что я не могу получить доступ к свойствам объектов Pixel из цикла. Я объявил rgb синтезированным свойством, чтобы получить к нему доступ, используя точечный синтаксис. Но когда я пытаюсь сделать это из цикла, программа вылетает, выдавая ошибку, подобную следующей:

'-[NSCFString rgb]: unrecognized selector sent to instance 0xa90bb50'

Вот пример кода, который генерирует эту ошибку:

for (Pixel *px in analyzedPxDictionary) {
    printf("r: %i, g: %i, b: %i",[[px.rgb objectAtIndex:0] integerValue], [[px.rgb objectAtIndex:1] integerValue], [[px.rgb objectAtIndex:2] integerValue]);
}

Я попытался установить точку останова на этой строке printf, чтобы проверить px. Хотя rgb указан как единое целое, если его свойства и правильно описаны как экземпляр NSArray, он, похоже, не содержит никаких объектов.

Я считаю, что правильно инициализирую rgb. Для объяснения рассмотрим следующий код:

NSString *key;
for (Pixel *px in analyzedPxDictionary) {
    key = [px description];
}

Pixel *px = [analyzedPxDictionary objectForKey:key];
printf("\nr: %i, g: %i, b: %i",[[px.rgb objectAtIndex:0] integerValue], [[px.rgb objectAtIndex:1] integerValue], [[px.rgb objectAtIndex:2] integerValue]);

Это успешно выводит правильные значения на консоль.

Так почему я не могу получить доступ к свойству rgb из цикла forin?

1 Ответ

6 голосов
/ 17 октября 2011

Быстрое перечисление NSDictionaries дает вам каждый ключ, а не каждое значение.Так что вам нужно сделать:

for (NSString *key in analyzedPxDictionary) 
{
    Pixel *px = [analyzedPxDictionary objectForKey:key];
    printf("r: %i, g: %i, b: %i",[[px.rgb objectAtIndex:0] integerValue], [[px.rgb objectAtIndex:1] integerValue], [[px.rgb objectAtIndex:2] integerValue]);
}
...