使用NSDictionary持有NSDictionary对象的快速枚举

时间:2012-11-25 06:53:21

标签: cocoa nsdictionary fast-enumeration

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

以下是代码:

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

(我最初输入的synsetsForPosNSDictionary,但此处描述的结果是相同的。)

在调试器中,我在log语句处暂停以在控制台中获取它:

(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

我不明白这里发生了什么,为什么在快速枚举代码中没有将其视为字典。

3 个答案:

答案 0 :(得分:4)

字典的快速枚举遍历而不是对象documentation

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

答案 1 :(得分:3)

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

您需要添加的内容是获取特定密钥的值并使用它:

NSDictionary *value = [dictionaryOfSynsetDictionaries valueForKey:synsetsForPos];

答案 2 :(得分:0)

这个问题很老但是对于未来的旅行者来说,另一个简单的解决方案就是在for子句中指定字典值:

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