Qual è l'equivalente Objective-C della funzione map()
di JS? Dovrei semplicemente usare NSFastEnumeration e applicare la funzione da solo?Qual è l'equivalente Objective-C della funzione `map()` di JS?
risposta
È 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
.)
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()
.
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
Funziona alla grande! 'valueForKey:' funziona bene anche con un array di NSDictionary. –
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);
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;
}
E 'costruito con Swift, anni solo il 3 e mezzo dopo hai fatto questa domanda – ArtOfWarfare