2010-08-22 15 views

Respuesta

10

Con el apoyo de los bloques (en IOS 4 o Snow Leopard):

FooType *myFoo = nil; 
NSUInteger index = [myArray indexOfObjectPassingTest:^BOOL (id obj, NSUInteger idx, BOOL *stop) { 
    return [obj isKindOfClass:[FooType class]]; 
}]; 
if (index != NSNotFound) myFoo = [myArray objectAtIndex:index]; 

En realidad no es más corto. Puede considerar escribir su propio método NSArray para hacerlo.

0

Nope. Así es como lo harías. Aunque puede haber una versión que acepte un bloqueo en la nueva API de iOS4 que podría hacerlo un poco más simple.

3

Como mencionó jtbandes, puede escribir un método NSArray como categoría si va a hacer esto mucho. Algo como esto:

@interface NSArray (FindClass) 
- (NSMutableArray *) findObjectsOfClass:(Class)theClass 
@end 

continuación

@implementation NSArray (FindClass) 
- (NSMutableArray *) findObjectsOfClass:(Class)theClass { 
    NSMutableArray *results = [[NSMutableArray alloc] init]; 

    for (id obj in self) { 
     if ([obj isKindOfClass:theClass]) 
      [results addObject:obj]; 
    } 

    return [results autorelease]; 
} 
@end 

entonces cuando desee utilizarlo apenas hacer:

NSMutableArray *objects = [myArray findObjectsOfClass:[FooType class]]; 

que debe contener todos los objetos de la clase especificada.

Descargo de responsabilidad: no probado, sorry si algo anda mal:/

Cuestiones relacionadas