我有一个NSMutableDictionary,analyzedPxDictionary
,包含一堆Pixel对象(我创建的自定义类)。除此之外,Pixel对象包含一个名为rgb
的NSArray属性。该数组将始终包含三个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
属性?
答案 0 :(得分:6)
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]);
}