2011-09-06 14 views

Respuesta

23

Se puede usar bloques de enumeración basada en hacerlo así.

// This will eventually contain the index of the object. 
// Initialize it to NSNotFound so you can check the results after the block has run. 
__block NSInteger foundIndex = NSNotFound; 

[array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 
    if ([obj isKindOfClass:[MyClass class]]) { 
     foundIndex = idx; 
     // stop the enumeration 
     *stop = YES; 
    } 
}]; 

if (foundIndex != NSNotFound) { 
    // You've found the first object of that class in the array 
} 

Si usted tiene más de un objeto de este tipo de clase en su conjunto, tendrá que ajustar un poco el ejemplo, pero esto debe darle una idea de lo que puede hacer.

Una ventaja de esta enumeración más rápida es que también le permite devolver el índice del objeto. Además, si usó enumerateObjectsWithOptions:usingBlock:, puede establecer opciones para buscar esto al mismo tiempo, por lo que puede obtener la enumeración con subprocesos de forma gratuita o elegir si buscar en la matriz en orden inverso.

Las API basadas en bloques son más flexibles. A pesar de que se ven nuevos y complicados, son fáciles de recoger una vez que comiences a usarlos, y luego comienzas a ver oportunidades para usarlos en todas partes.

+0

¿Cuál es la ventaja de utilizar un método basado en bloques, además de poder especificar una variable para detener la enumeración? – futureelite7

+0

Usaría NSNotFound en lugar de -1. – NSResponder

+0

@NSResponder - Buena captura - gracias. – Abizern

7

Puede utilizar la enumeración rápida para recorrer la matriz y comprobar si la clase:

BOOL containsClass = NO; 

for (id object in array) { 
    if ([object isKindOfClass:[MyClass class]]) { 
     containsClass = YES; 
     break; 
    } 
} 
8

Puede hacerlo con NSPredicate.

NSPredicate *p = [NSPredicate predicateWithFormat:@"self isKindOfClass: %@", 
                 [NSNumber class]]; 
NSArray *filtered = [identifiers filteredArrayUsingPredicate:p]; 
NSAssert(filtered.count == identifiers.count, 
     @"Identifiers can only contain NSNumbers."); 
Cuestiones relacionadas