[ios] 사전을 반복하는 방법이 있습니까?

를 얻기 위해 NSDictionaries필요한 곳으로 알고 있습니다. 하지만 어떻게 모든 것을 내가 반복 할 수 와 A의는 , 나는 키가 알고 그래서, 어떤이있다 값? 나는라는 것이 있습니다 알고 에 대한-에서 루프 에가 . 비슷한 것이 있습니까?keyvaluekeysvaluesNSDictionaryJavaScriptObjective-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.
    }];

자동 완성 기능을 사용하면 설정 속도가 매우 빠르므로 반복 봉투 작성에 대해 걱정할 필요가 없습니다.


답변