를 얻기 위해 NSDictionaries
필요한 곳으로 알고 있습니다. 하지만 어떻게 모든 것을 내가 반복 할 수 와 A의는 , 나는 키가 알고 그래서, 어떤이있다 값? 나는라는 것이 있습니다 알고 에 대한-에서 루프 에가 . 비슷한 것이 있습니까?key
value
keys
values
NSDictionary
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 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.
}];
자동 완성 기능을 사용하면 설정 속도가 매우 빠르므로 반복 봉투 작성에 대해 걱정할 필요가 없습니다.