답변:
예, 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