사전을 반복 할 수있는 방법이 있습니까?
-
18-09-2019 - |
문제
알아요 NSDictionaries
필요한 곳으로 key
얻기 위해 value
. 그러나 어떻게 모든 것을 반복 할 수 있습니까? keys
그리고 values
안에 NSDictionary
, 어떤 열쇠가 있고 어떤 가치가 있는지 알 수 있습니다. 나는 a라는 것이 있다는 것을 알고 있습니다 루프를위한 안에 JavaScript
. 비슷한 것이 있습니까? Objective-C
?
해결책
예, 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 Pre-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
a로 구현됩니다 해시 가능 (이는 요소를 찾는 데 드는 비용이 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.
}];
자동 완성을 사용하면 설정이 매우 빠르며 반복 봉투 작성에 대해 걱정할 필요가 없습니다.