Для чего используется аргумент 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;
}
}
}