回答:
はい、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]);
別の方法(あなたは、Mac OS Xをターゲットにしている場合に使用する必要があり、10.5を事前に、あなたはまだ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]);
ブロックアプローチでは、すべてのキーに対してルックアップアルゴリズムを実行する必要がありません。
[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%高速です。
これは、ブロックアプローチを使用した反復です。
NSDictionary *dict = @{@"key1":@1, @"key2":@2, @"key3":@3};
[dict enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
NSLog(@"%@->%@",key,obj);
// Set stop to YES when you wanted to break the iteration.
}];
オートコンプリートを使用すると、設定が非常に高速になり、反復エンベロープの作成について心配する必要はありません。
NSMutableDictionary
プロセスを変更する必要がある場合の良い解決策
Swift
構文で繰り返す場合は、この投稿を参照してください:stackoverflow.com/a/24111700/419348