2012-11-25 97 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]); 
}