나는 enumerateObjectsUsingBlock:
최근에 빠른 열거 요구 사항을 위해 많이 사용 BOOL *stop
하고 있으며 열거 블록에서의 사용법을 이해하는 데 어려움을 겪고 있습니다.
NSArray
클래스 참조 상태
stop
: 부울 값에 대한 참조입니다. 블록은YES
배열의 추가 처리를 중지 하기 위해 값을 로 설정할 수 있습니다 .stop
인수는 아웃 전용 인수입니다. 이 부울YES
은 블록 내 에서만 설정해야합니다 .
따라서 물론 열거를 중지하기 위해 블록에 다음을 추가 할 수 있습니다.
if (idx == [myArray indexOfObject:[myArray lastObject]]) {
*stop = YES;
}
내가 말할 수있었습니다 바로는, 명시 적으로 설정하지 않는 *stop
하기 위해 YES
어떤 부정적인 부작용이 없습니다. 열거 형은 배열의 끝에서 자동으로 중지되는 것 같습니다. 그래서 *stop
블록에서 정말 필요합니까?
답변
stop
Block에 대한 인수를 사용하면 열거를 조기 에 중지 할 수 있습니다 . break
일반 for
루프 와 동일 합니다. 배열의 모든 개체를 살펴 보려면 무시할 수 있습니다.
for( id obj in arr ){
if( [obj isContagious] ){
break; // Stop enumerating
}
if( ![obj isKindOfClass:[Perefrigia class]] ){
continue; // Skip this object
}
[obj immanetizeTheEschaton];
}
[arr enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
if( [obj isContagious] ){
*stop = YES; // Stop enumerating
return;
}
if( ![obj isKindOfClass:[Perefrigia class]] ){
return; // Skip this object
}
[obj immanentizeTheEschaton];
}];
호출 범위의 변수에 대한 참조이기 때문에 out 매개 변수입니다. 블록 내부에 설정해야하지만 s 내부에서 읽는 enumerateObjectsUsingBlock:
것과 같은 방식으로 NSError
s가 일반적으로 프레임 워크 호출에서 코드로 다시 전달됩니다.
- (void)enumerateObjectsUsingBlock:(void (^)(id obj, NSUInteger idx, BOOL *stop))block {
// N.B: This is probably not how this method is actually implemented!
// It is just to demonstrate how the out parameter operates!
NSUInteger idx = 0;
for( id obj in self ){
BOOL stop = NO;
block(obj, idx++, &stop);
if( stop ){
break;
}
}
}