Для чего используется аргумент bool *stop для enumerateObjectsUsingBlock:?
Я использую enumerateObjectsUsingBlock:
много в последнее время для моих потребностей быстрого перечисления, и мне трудно понять использование BOOL *stop
в блоке перечисления.
The NSArray
класс ссылка государства -
stop
: ссылка на логическое значение. Блок может установить значениеYES
to остановите дальнейшую обработку массива. Элементstop
аргумент является out-only аргумент. Вы должны только когда-либо установить это логическое значение вYES
в Блок.
так что, конечно, я могу добавить следующее В моем блоке, чтобы остановить перечисление:
if (idx == [myArray indexOfObject:[myArray lastObject]]) {
*stop = YES;
}
из того, что я смог сказать, не задан *stop
до YES
не имеет никаких негативных побочных эффектов. Перечисление, кажется, автоматически останавливается в конце массива. Так что с помощью *stop
действительно необходимо в блоке?
1 ответ:
The
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]; }];
это параметр out, потому что он является ссылкой на переменную из области вызова. Он должен быть установлен внутри вашего блока, но читать внутри
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; } } }