2011-01-19 7 views

risposta

33

È possibile utilizzare NSArray s' enumerateObjectsUsingBlock: se siete su OS X 10.6 o iOS 4 .:

NSMutableArray *mapped = [NSMutableArray arrayWithCapacity:[array count]]; 
[array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 
    id mapObj = DoSomethingToObject(obj); 
    [mapped addObject:mapObj]; 
}]; 

(Shameless ma rilevanti spina: ho un library per OS X e iOS che aggiunge mappa e altre funzionalità simili a NSArray e NSSet.)

+0

Che dire di * gasp * iOS 3.x? – Moshe

+0

@Moshe: Allora dovrai farlo con un ciclo for. – mipadi

+7

+1 per il collegamento alla libreria delle raccolte. Non essere imbarazzato di condividere il tuo buon lavoro, di gridare forte! Sembra una grande risorsa. –

8

Fai da te. Non esiste un singolo metodo equivalente a quello che vuoi.

Edit: Per chi downvoting, questa è stata la risposta corretta al momento (tre anni fa) e ancora è per Objective-C, ma Swift ha una funzione map().

10

Dipende. Se si dispone, ad esempio, un array di oggetti, e questi oggetti hanno una proprietà URL (per esempio), allora si può fare:

NSArray * urls = [myArray valueForKey:@"URL"]; 

Allo stesso modo, se si può attivare il comportamento degli oggetti in questione tramite un singolo messaggio che prende 0 o 1 parametri, si può fare:

[myArray makeObjectsPerformSelector:@selector(doFoo)]; 
//or: 
[myArray makeObjectsPerformSelector:@selector(doFooWithBar:) withObject:aBar]; 

per nulla al di là che, dovrete iterare gli oggetti da soli. È possibile utilizzare un ciclo for(), un loop for(in), o qualcosa di simile -enumerateObjectsUsingBlock:, ecc

+0

Funziona alla grande! 'valueForKey:' funziona bene anche con un array di NSDictionary. –

4

Controllare BlocksKit, fornisce carta, ridurre e filer per NSArray.

  • (NSArray *) mappa: (BKTransformBlock) blocco;
  • (id) ridurre: (id) iniziale con Blocco: (blocco BKAccumulationBlock);
  • (NSArray *) selezionare: blocco (BKValidationBlock);
1

funzione Category per NSArray alternativa

- (NSArray *)map:(id(^)(id, BOOL *))block { 
    NSMutableArray * array = [NSMutableArray array]; 
    [self enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 
     id newObject = block(obj,stop); 
     if (newObject == nil) { 
      newObject = [NSNull null]; 
     } 
     [array addObject:newObject]; 
    }]; 
    return array.copy; 
} 

Categoria funzione per NSMutableArray alternativa

- (NSMutableArray *)map:(id(^)(id))block { 
    NSEnumerator * enumerator = ((NSArray *)self.copy).objectEnumerator; 
    id obj; NSUInteger idx = 0; 
    while ((obj = enumerator.nextObject)) { 
     self[idx] = block(obj) ?: [NSNull null]; 
     idx++; 
    } 
    return self; 
}