2013-03-23 5 views
3

주어진 인덱스 이전에 발생하는 NSArray의 인덱스를 반복하는 가장 간단한 방법은 무엇입니까? 예를 들면 : 또한enumerateObjectsAtIndexes 또는 for 루프를 사용하여 NSArray의 모든 인덱스를 반복 할 수 있습니다. 특정 인덱스 전에

NSArray *myArray = @[ @"animal" , @"vegetable" , @"mineral" , @"piano" ]; 

[myArray enumerateObjectsAtIndexes:@"all before index 2" options:nil 
    usingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 
      // this block will be peformed on @"animal" and @"vegetable" 
    }]; 

, 지정된 인덱스가 0

이며이 작업을 수행 할 수있는 가장 간결하고 우아한 방법은 무엇입니까 모든 경우에이해야하지 루프? 지금까지 나는 성가신 NSRanges와 인덱스 세트를 사용하는 서투른 다중 회선 답을 함께 수정했다. 내가 바라 보는 더 좋은 방법이 있습니까?

+0

을 구현하는 방법의 모든 번호를 추가합니다. 간결 함이 명확한 것은 아닙니다. 실제 일을 잘 사용하십시오. 프레임 워크와 싸우지 마십시오. NSArray 반복에는 해당 메서드를 사용할 필요가 없습니다. 그 방법은 블록을 잘 사용하는 것에 큰 도움이되는 블록 사용법을 제공합니다. – uchuugaka

답변

1

무엇에 대해 :

index = 2; 
for (int i = 0; i < [myArray count] && i < index; ++i) { 
    id currObj = [myArray objectAtIndex:i]; 
    // Do your stuff on currObj; 
} 
+0

왜 [가 필요합니까? – zakdances

+0

인덱스> = [myArray 카운트] 문제가있는 경우 : – giorashc

3
NSArray *myArray = @[ @"animal" , @"vegetable" , @"mineral" , @"piano" ]; 
NSUInteger stopIndex = 2; 

[myArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 
    if (idx == stopIndex) { 
     *stop = YES; // stop enumeration 
    } else { 
     // Do something ... 
     NSLog(@"%@", obj); 
    } 
}]; 
+0

이것은 좋은 것입니다. if/else없이이 작업을 수행 할 수있는 방법이 있습니까? 뭔가 * stop = (idx == stopIndex) 같은가요? (반환;) : 아니오; – zakdances

+0

@yourfriendzak : 그렇지 않습니다. 문서에 따르면'* stop '에만'YES'를 지정해야합니다. 그리고 삼항 연산자 내에서'return '을 호출하는 것은 내가 "난독 화 프로그래밍"이라고 부르는 것입니다 :-) –

+0

이 요구 사항은 열거 메소드의 다른 변형에 의해 제공되는 동시 열거 때문입니다. – bbum

3
[myArray enumerateObjectsAtIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, idx)]  
          options:0 
         usingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 

}]; 
+1

NSMakeRange (-1, idx)에서 왜'-1'인가? 그게 '0'이 될까요? –

+0

@ MartinR 고정, 고맙습니다. – zakdances

+1

@yourfriendzak. 또한 (NSEnumerationOption) 옵션에 대한 인수로 nil을 제공하면 타입 캐스팅 경고가 표시됩니다. 그러므로 여기에 아무 것도주지 말고 경고를 무시하려면 0을 제공하는 것이 좋습니다. – Arslan

1

는 개인적으로 내가 Martin R 또는 yourfriendzak 같이 블록 기반 열거와 함께 가고 싶어요, giorashc에 의해 허용 대답 그것으로, 아마 최악 돌연변이 가드를 제공하지 않습니다.

은 내가 (올바른) 빠른 열거 예를

NSUInteger stopIndex = 2; 
NSUInteger currentIndex = 0; 
for (MyClass *obj in objArray) { 
    if (currentIndex < stopIndex) { 
     // do sth... 
    } else { 
     break; 
    } 
    ++currentIndex;  
}