IT

enumerateObjectsUsingBlock : 사용되는 BOOL * stop 인수는 무엇입니까?

lottoking 2020. 9. 16. 07:58
반응형

enumerateObjectsUsingBlock : 사용되는 BOOL * stop 인수는 무엇입니까?


나는 enumerateObjectsUsingBlock:최근에 열거 요구 사항을 위해 많이 사용 BOOL *stop하고 있고 열거 블록에서의 사용법을 이해하는 데 어려움을 겪고 있습니다.

NSArray클래스 참조 상태

stop: 부울 값에 대한 참조입니다. 은 블록 YES배열의 추가 처리를 중지 하기 위해 값을 설정할 수 있습니다 . stop인수는 아웃 전용 인수입니다. 이 부울 YES은 블록 내 에서만 설정해야합니다 .

거기에 열거를 중지하기 위해 블록에 다음을 추가 할 수 있습니다.

if (idx == [myArray indexOfObject:[myArray lastObject]]) {
    *stop = YES;
}

내가 말할 수있는 바로는, 명시 적으로 적으로 설정하지 않는 *stop하기 YES위해 어떤 부작용이 없습니다. 열거는 배열의 끝에서 자동으로 중지되는 것입니다. 그래서 *stop블록에서 정말 필요합니까?


stopBlock에 대한 인수를 사용하면 열거를 조기 에 중지 할 수 있습니다 . 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 매개 변수입니다. 블록 내부에 설정해야하지만 내부에서 읽히는 enumerateObjectsUsingBlock:것과 같은 방식으로 NSError의가 일반적으로 프레임 워크 호출에서 코드 로 다시 전달됩니다 .

- (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;
        }
    }
}

참고 URL : https://stackoverflow.com/questions/12357904/what-is-the-bool-stop-argument-for-enumerateobjectsusingblock-used-for

반응형