【问题标题】:Fast enumeration with NSDictionary holding NSDictionary objectsNSDictionary 持有 NSDictionary 对象的快速枚举
【发布时间】:2012-11-25 06:53:21
【问题描述】:

我有一个带有四个对象的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

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

【问题讨论】:

    标签: cocoa nsdictionary fast-enumeration


    【解决方案1】:

    字典的快速枚举迭代 keys 而不是 objectsdocumentation.

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

    【讨论】:

      【解决方案2】:

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

      您需要添加的是获取特定键的值并使用它:

      NSDictionary *value = [dictionaryOfSynsetDictionaries valueForKey:synsetsForPos];
      

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-12-07
          • 1970-01-01
          • 2011-12-12
          • 2023-03-15
          相关资源
          最近更新 更多