Для чего используется аргумент s top BOOL * для enumerateObjectsUsingBlock: используется?

Я использую enumerateObjectsUsingBlock: много в последнее время для моих потребностей быстрого перечисления, и мне трудно понять использование BOOL *stop в блоке перечисления.

NSArray эталонные состояния класса

stop: Ссылка на логическое значение. Блок может установить значение в YES остановить дальнейшую обработку массива. stop Аргумент является аргументом только для использования. Вы должны только когда-либо установить этот логический YES в блоке.

Поэтому, конечно, я могу добавить следующее в мой блок, чтобы остановить перечисление:

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

Из того, что я был в состоянии сказать, не устанавливая явно *stop в YES не имеет негативных побочных эффектов. Перечисление автоматически останавливается в конце массива. Так использует *stop действительно необходимо в блоке?

1 ответ

Решение

stop Аргумент в блок позволяет преждевременно остановить перечисление. Это эквивалент 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];
}];

Это выходной параметр, потому что это ссылка на переменную из вызывающей области. Это должно быть установлено внутри вашего блока, но читать внутри 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;
        }
    }
}
Другие вопросы по тегам