NSMutable 사전에 액세스하기위한 Objective-C의 각 루프


268

Objective-C에서 변경 가능한 사전 키와 값에 액세스하는 데 어려움이 있습니다.

내가 이것을 가지고 있다고 가정 해보십시오.

NSMutableDictionary *xyz=[[NSMutableDictionary alloc] init];

키와 값을 설정할 수 있습니다. 이제 각 키와 값에 액세스하고 싶지만 키 세트 수를 모릅니다.

PHP에서는 다음과 같이 매우 쉽습니다.

foreach ($xyz as $key => $value)

Objective-C에서 어떻게 가능합니까?

답변:


662
for (NSString* key in xyz) {
    id value = xyz[key];
    // do stuff
}

NSFastEnumeration 프로토콜 (10.5 이상 및 iOS에서 사용 가능)을 준수하는 모든 클래스에서 작동하지만 NSDictionary값 대신 키를 열거 할 수있는 몇 안되는 컬렉션 중 하나입니다. Collections Programming Topic 에서 빠른 열거 에 대해 읽으십시오 .

오, 당신이해야하지만 추가해야 결코 그것을 통해 열거하는 동안 컬렉션을 수정할 수 없습니다.


4
궁금한 것이 아니 었습니다. for ([xyz allKeys]의 NSString * 키) ?? 아니면 중요하지 않습니다.
FlowUI. SimpleUITesting.com

6
@ user76859403 사전을 열거하면 실제로 키가 열거됩니다. for (NSString* key in [xyz allKeys])개념적으로 같은 것입니다.
zneak

키를 열거하는 동안 사전을 변경해야하는 경우 [xyz allKeys]를 사용하십시오. 아래 답변을 참조하십시오.
Brody Robertson

이 루프는 항상 같은 순서를 반환합니까? 아니면 TableView 섹션에 사용할 다른 방법이 필요합니까?
ymutlu

1
@ymutlu, Cocoa 사전은 순서가 없습니다. 이는 반복 순서가 수정 될 때마다 변경 될 수 있음을 의미합니다.
zneak

98

블록을 사용하여 키와 값을 열거하는 10.6+ 옵션을 생략하지 않으려면 ...

[dict enumerateKeysAndObjectsUsingBlock:^(id key, id object, BOOL *stop) {
    NSLog(@"%@ = %@", key, object);
}];

작업을 동시에 수행하려는 경우 :

[dict enumerateKeysAndObjectsWithOptions:NSEnumerationConcurrent
                              usingBlock:^(id key, id object, BOOL *stop) {
    NSLog(@"%@ = %@", key, object);
}];

2
사전을 통해 열거하는 3 가지 방법. . . VB에 7 가지 종류의 루프가있는 "가장 이상한 언어 기능"이 떠 오릅니다.
dreamlax

3
Well ... objectEnumerator는 1994 년에 추가되었고 for (... in ...)는 2006 년경에, 그리고 Blocks는 2009 년에 추가되었습니다.
bbum

이 빠르게 표준보다 같다 에서 ...에 대한 구조 : oneofthesedaysblog.com/block-vs-for-in-objective-c-enumeration
lkraider

1
@lkraider, 나는 그 게시물에 대해 언급했는데, 실제로 블록 기반 열거를 for ... in 구문이 아닌 이전 for 루프와 비교합니다.
퀸 테일러

무엇입니까 *stop? 어떻게 사용합니까? 어떤 참조?
borisdiakur

13

열거하는 동안 사전 을 변경 해야하는 경우 :

for (NSString* key in xyz.allKeys) {
    [xyz setValue:[NSNumber numberWithBool:YES] forKey:key];
}

이유는 allKeys키 사본을 리턴하기 때문입니다 . 따라서 사전을 변경하는 것이 안전합니다.
Honghao Zhang

5

사전을 열거하는 가장 쉬운 방법은

for (NSString *key in tDictionary.keyEnumerator) 
{
    //do something here;
}

어디 tDictionary이다 NSDictionary또는 NSMutableDictionary당신은 반복합니다.



2

빠른 열거는 10.5와 iPhone OS에 추가되었으며 구문 설탕뿐만 아니라 상당히 빠릅니다. 이전 런타임을 대상으로해야하는 경우 (예 : 10.4 이상) 이전 열거 방법을 사용해야합니다.

NSDictionary *myDict = ... some keys and values ...
NSEnumerator *keyEnum = [myDict keyEnumerator];
id key;

while ((key = [keyEnum nextObject]))
{
    id value = [myDict objectForKey:key];
    ... do work with "value" ...
}

열거 자 개체를 해제하지 않고 다시 설정할 수 없습니다. 다시 시작하려면 사전에서 새 열거 자 객체를 요청해야합니다.


1

-[NSDictionary allKeys]모든 키에 액세스하고 반복 하는 데 사용할 수 있습니다 .


2
그러나 자동 배포 된 추가 배열을 만들면 특히 키가 많은 사전의 경우 매우 낭비가 될 수 있습니다.
Quinn Taylor
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.