Для чего используется аргумент bool *stop для enumerateObjectsUsingBlock:?
Я использую enumerateObjectsUsingBlock: много в последнее время для моих потребностей быстрого перечисления, и мне трудно понять использование BOOL *stop в блоке перечисления.
The NSArray класс ссылка государства -
stop: ссылка на логическое значение. Блок может установить значениеYESto остановите дальнейшую обработку массива. Элемент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:, таким же образомNSErrors обычно передаются обратно ваш код из базы звонков.- (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; } } }