2012-04-05 13 views
9

In iOS voglio implementare la funzione mappa per NSArray. Questa è una funzione che viene applicata a ogni elemento dell'array. Qual è il modo migliore per implementarlo?NSArray. Come posso implementare la funzione Mappa?

Grazie,
Doug

+2

mappa è una trasforma da una cosa all'altra ... stai cercando "foreach", non la mappa ... detto questo, la risposta accettata è corretta. –

risposta

6

È possibile utilizzare enumerateObjectsUsingBlock: funzione del NSArray.

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

dasblinkenlight si signore, abbiamo un vincitore. Funzionerà abbastanza bene. Grazie per questo. Saluti. – dugla

+24

Perché questo è un vincitore. Una funzione mappa dovrebbe restituire un nuovo array in cui ogni elemento dell'originale è stato applicato dal blocco. enumerateObjectsUsingBlock restituisce void. –

+0

@SaniElfishawy Quale OP chiama "mappa" si differenzia da una definizione più comune: voleva un meccanismo "foreach" per applicare la propria funzione (la prima parte della classica "mappa") ma non voleva raccogliere i risultati del trasformare (la seconda parte della funzionalità "mappa"). Ho risposto alla domanda in base alla descrizione dell'OP della funzionalità desiderata, ad esempio "Questa è una funzione che viene applicata a ogni elemento dell'array". – dasblinkenlight

6

Si sta cercando di applicare come mappa deve restituire un nuovo array con i valori trasformati.

Tuttavia è possibile aumentare NSArray con i metodi che si cercano creando una categoria personalizzata. Ecco due esempi - applicare e mappa:

@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

Se si utilizza Objective-C, si può semplicemente utilizzare questi metodi:

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

Per esempio:

[array makeObjectsPerformSelector:@selector(doSomething)]; 
Problemi correlati