2012-11-25 99 views
2

我有一个NSDictionary与四个对象。每个对象是包含数千个对象的NSDictionary。我通过记录顶级字典的描述来验证它包含它应该是什么。但是,当我运行下面的代码时,要枚举该顶级字典中的对象,调试器显示一个错误,指示返回的对象是sting而不是字典。快速枚举NSDictionary持有NSDictionary对象

下面是代码:

for(id synsetsForPos in dictionaryOfSynsetDictionaries) { 
    NSLog(@"synsetsForPos is class of %@ with description %@", [synsetsForPos class], [synsetsForPos description]); 

(我原来录入synsetsForPos作为NSDictionary,但这里所描述的结果都是一样的。)

在调试器中,我在日志语句停止得到这在控制台:

(lldb) po [synsetsForPos class] 
(id) $2 = 0x016e2c8c __NSCFConstantString 
(lldb) po [[dictionaryOfSynsetDictionaries objectForKey:@"n"] class] 
(id) $3 = 0x016d3e0c __NSCFDictionary 
(lldb) po [[dictionaryOfSynsetDictionaries objectForKey:@"r"] class] 
(id) $6 = 0x016d3e0c __NSCFDictionary 
(lldb) po [[dictionaryOfSynsetDictionaries objectForKey:@"v"] class] 
(id) $7 = 0x016d3e0c __NSCFDictionary 
(lldb) po [[dictionaryOfSynsetDictionaries objectForKey:@"a"] class] 
(id) $8 = 0x016d3e0c __NSCFDictionary 
(lldb) po [dictionaryOfSynsetDictionaries allKeys] 
(id) $10 = 0x653662a0 <__NSArrayI 0x653662a0>(
r, 
n, 
v, 
a 
) 

然后,让日志语句执行,我得到这个:

2012-11-24 22:32:41.069   [6037:fb03] synsetsForPos is class of __NSCFConstantString with description r 
(lldb) 

后跟此错误消息:

2012-11-24 22:41:21.287   [6037:fb03] -[__NSCFConstantString countByEnumeratingWithState:objects:count:]: unrecognized selector sent to instance 0x1faf8 

我不明白是怎么回事,这是为什么不被视为在快速枚举代码字典。

回答

4

字典迭代的快速列举了对象documentation

改为使用enumerateKeysAndObjectsUsingBlock: 。它可能同样快 - 请参阅讨论here

3

快速枚举Objective-C中的字典返回的值为keys。在你的例子中,你的for-loopfor(NSString *synsetsForPos in [dictionaryOfSynsetDictionaries keys])相同。

你需要什么补充的是一个特定的密钥和工作能与它的值:

NSDictionary *value = [dictionaryOfSynsetDictionaries valueForKey:synsetsForPos]; 
+1

+1你的回答在同一时间Jrturton的走了进来。 – Jim

0

的问题是旧的,但对于未来的旅客另一种简单的解决方法是在刚刚指定条款的字典值:

for(NSDictionary *synsetsForPos in [dictionaryOfSynsetDictionaries allValues]) { 
    NSLog(@"synsetsForPos is class of %@ with description %@", [synsetsForPos class], [synsetsForPos description]); 
}