Eu tenho usado enumerateObjectsUsingBlock:
muito ultimamente para minhas necessidades de enumeração rápida, e eu estou tendo dificuldade em entender o uso de BOOL *stop
no bloco de enumeração.
Os estados de referência da class NSArray
stop
: uma referência a um valor booleano. O bloco pode definir o valor comoYES
para interromper o processamento adicional do array. O argumentostop
é um argumento somente externo. Você só deve definir este booleano paraYES
dentro do bloco.
Então, é claro, eu posso adicionar o seguinte no meu bloco para parar a enumeração:
if (idx == [myArray indexOfObject:[myArray lastObject]]) { *stop = YES; }
Pelo que pude dizer, não definir explicitamente *stop
para YES
não tem nenhum efeito colateral negativo. A enumeração parece parar automaticamente no final da matriz. Então está usando *stop
realmente necessário em um bloco?
O argumento de stop
para o bloco permite que você pare a enumeração prematuramente . É o equivalente a break
de um loop for
normal. Você pode ignorá-lo se quiser passar por todos os objects da matriz.
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]; }];
Esse é um parâmetro out porque é uma referência a uma variável do escopo de chamada. Ele precisa ser definido dentro do seu bloco, mas lido dentro de enumerateObjectsUsingBlock:
NSError
da mesma forma que os NSError
do NSError
são normalmente passados de volta para o seu código a partir de chamadas do framework.
- (void)enumerateObjectsUsingBlock:(void (^)(id obj, NSUInteger idx, BOOL *stop))block { // NB: 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; } } }