を取得するためにNSDictionaries
が必要な場所を知っています。しかし、どのキーがあり、どの値があるかを知るために、どのように allとaを反復処理できますか? に for- in -loopと呼ばれるものがあることは知っています。に似たようなものはありますか?key
value
keys
values
NSDictionary
JavaScript
Objective-C
128094 次
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 に答える