문제

알아요 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.
    }];

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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top