212

を取得するためにNSDictionariesが必要な場所を知っています。しかし、どのキーがあり、どの値があるかを知るために、どのように allとaを反復処理できますか? に for- in -loopと呼ばれるものがあることは知っています。に似たようなものはありますか?keyvaluekeysvaluesNSDictionaryJavaScriptObjective-C

4

3 に答える 3

344

はい、NSDictionary高速列挙をサポートします。Objective-C 2.0 では、次のことができます。

// To print out all key-value pairs in the NSDictionary myDict
for(id key in myDict)
    NSLog(@"key=%@ value=%@", key, [myDict objectForKey:key]);

別の方法 (10.5 より前の Mac OS X をターゲットにしている場合に使用する必要がありますが、10.5 および iPhone でも引き続き使用できます) は、次を使用することNSEnumeratorです。

NSEnumerator *enumerator = [myDict keyEnumerator];
id key;
// extra parens to suppress warning about using = instead of ==
while((key = [enumerator nextObject]))
    NSLog(@"key=%@ value=%@", key, [myDict objectForKey:key]);
于 2009-08-16T14:40:16.627 に答える
159

ブロック アプローチでは、すべてのキーに対してルックアップ アルゴリズムを実行する必要がありません。

[dict enumerateKeysAndObjectsUsingBlock:^(id key, id value, BOOL* stop) {
  NSLog(@"%@ => %@", key, value);
}];

はハッシュテーブルNSDictionaryとして実装されていますが(つまり、要素を検索するコストはO(1)

d私の測定によると、数字の辞書については...

NSMutableDictionary* dict = [NSMutableDictionary dictionary];
for (int i = 0; i < 5000000; ++i) {
  NSNumber* value = @(i);
  dict[value.stringValue] = value;
}

... ブロックアプローチで数字を合計 ...

__block int sum = 0;
[dict enumerateKeysAndObjectsUsingBlock:^(NSString* key, NSNumber* value, BOOL* stop) {
  sum += value.intValue;
}];

...ループアプローチではなく...

int sum = 0;
for (NSString* key in dict)
  sum += [dict[key] intValue];

...約 40% 高速です。

編集: 新しい SDK (6.1+) はループの反復を最適化するように見えるため、少なくとも上記の単純なケースでは、ループ アプローチはブロック アプローチよりも約 20% 高速です。

于 2012-09-17T07:24:45.430 に答える