2

私はNSDictionary4つのオブジェクトを持っています。各オブジェクトには、NSDictionary何千ものオブジェクトが含まれています。トップレベルの辞書の説明をログに記録して、想定されている内容が含まれていることを確認しました。ただし、以下のコードを実行して、その最上位のディクショナリ内のオブジェクトを列挙すると、デバッガーにエラーが表示され、返されたオブジェクトがディクショナリではなくスティングであることを示します。

コードは次のとおりです。

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

(元々はと入力synsetsForPosしましNSDictionaryたが、ここで説明する結果は同じです。)

デバッガーでは、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
)

次に、logステートメントを実行すると、次のようになります。

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

3 に答える 3

4

辞書の高速列挙は、オブジェクトではなくキーを反復処理します:ドキュメント

enumerateKeysAndObjectsUsingBlock: 代わりに使用してください。それはおそらく同じくらい速いです-ここの議論を見てください。

于 2012-11-25T07:24:43.493 に答える
3

Objective-Cの辞書の高速列挙では、の戻り値が返されますkeys。あなたの例では、あなたfor-loopはと同じfor(NSString *synsetsForPos in [dictionaryOfSynsetDictionaries keys])です。

追加する必要があるのは、特定のキーの値を取得して操作することです。

NSDictionary *value = [dictionaryOfSynsetDictionaries valueForKey:synsetsForPos];
于 2012-11-25T07:24:19.133 に答える
0

質問は古いですが、将来の旅行者にとって、別の簡単な解決策は、for句で辞書の値を指定することです。

for(NSDictionary *synsetsForPos in [dictionaryOfSynsetDictionaries allValues]) {
    NSLog(@"synsetsForPos is class of %@ with description %@", [synsetsForPos class], [synsetsForPos description]);
}
于 2017-11-11T20:54:39.267 に答える