2012-04-05 11 views
9

En iOS, quiero implementar la función de mapa para NSArray. Esta es una función que se aplica a cada elemento de la matriz. ¿Cuál es la mejor manera de implementar esto?NSArray. ¿Cómo implemento la función Mapa?

Gracias,
Doug

+2

correspondencia es un transformarse de una cosa a otra ... estás buscando "foreach", no un mapa ... dicho eso, la respuesta aceptada es correcta. –

Respuesta

6

Puede utilizar la función de enumerateObjectsUsingBlock:NSArray.

[myArray enumerateObjectsUsingBlock:^(id x, NSUInteger index, BOOL *stop) { 
    // Body of the function 
}]; 
+1

dasblinkenlight sí señor, tenemos un ganador. Eso funcionará bastante bien. Gracias por esto. Aclamaciones. – dugla

+24

¿Por qué es esto un ganador? Una función de mapa debe devolver una nueva matriz donde el bloque ha actuado sobre cada elemento del original. enumerateObjectsUsingBlock devuelve void. –

+0

@SaniElfishawy Lo que OP llama "mapa" difiere de una definición más común: quería un mecanismo "foreach" para aplicar su propia función (la primera parte del "mapa" clásico) pero no quería recopilar los resultados del transformar (la segunda parte de la funcionalidad "mapa"). Respondí la pregunta en función de la descripción de OP de la funcionalidad deseada, es decir, "Esta es una función que se aplica a cada elemento de la matriz". – dasblinkenlight

6

Está buscando aplicar como mapa debe devolver una nueva matriz con los valores transformados.

Sin embargo, puede aumentar NSArray con los métodos que busca mediante la creación de una categoría personalizada. He aquí dos ejemplos - aplicar y el mapa:

@implementation NSArray (CMMap) 
- (NSArray *) map:(id(^)(id obj))block { 
    NSMutableArray *a = @[].mutableCopy; 
    for (id o in self) { 
     id on = block(o); 
     if (!on) { 
      NSLog(@"NSArray::map() - object returned by block is nil!"); 
      abort(); 
     } 
     [a addObject: on]; 
    } 
    return [NSArray arrayWithArray: a]; 
} 

- (void) apply:(void(^)(id obj))block { 
    for (id o in self) { 
     block(o); 
    } 
} 
@end 
0

Si está usando Objective-C, puede simplemente usar estos métodos:

- (void)makeObjectsPerformSelector:(SEL)aSelector; 
- (void)makeObjectsPerformSelector:(SEL)aSelector withObject:(nullable id)argument; 

Por ejemplo:

[array makeObjectsPerformSelector:@selector(doSomething)]; 
Cuestiones relacionadas