2015-08-14 11 views
5

Dire che ho NSArray *x = @[@1, @2, @3, @4];Equivalente di .map di Swift nell'obiettivo C?

Ora dico che voglio un array come @[@2, @4, @6, @8]

In buona ole Swift, posso solo fare:

xDoubled = x.map({($0) * 2}) 

Qualcuno può dirmi come posso fare questo in Objective -C senza fare -

NSMutableArray *xDoubled = [NSMutableArray new]; 
for (NSInteger xVal in x) { 
    [xDoubled addObject:xVal * 2]; 
} 

?

+1

http://www.openradar.me/radar?id=5364414152704000 (e il mio è un duplicato di una richiesta molto più vecchia). Oggi non esiste un metodo di mappatura in Cocoa. –

risposta

3

NSArray non ha un metodo map. Ha un metodo enumerateObjectsUsingBlock: (e relativi) che fa qualcosa di simile; non convertono automaticamente un oggetto in un altro e restituiscono un altro array, ma puoi farlo manualmente con sufficiente facilità. Tuttavia, non sono molto diversi dal tuo esempio.

Ho scritto una libreria chiamata collections che aggiunge un metodo map (e altri metodi collezioni orientate) per NSArray, NSDictionary, e NSSet, però.

1

Non lo consiglio necessariamente, ma puoi fare cose strane sfruttando le categorie e la codifica dei valori-chiave. Ad esempio:

@interface NSNumber (DoubledValue) 
- (NSNumber*) doubledValue; 
@end 

@implementation NSNumber (DoubledValue) 
- (NSNumber*) doubledValue 
{ 
    return @([self doubleValue] * 2); 
} 
@end 

xDoubled = [x valueForKey:@"doubledValue"]; 

In generale, per ogni operazione che può essere espressa come percorso chiave o chiave per una proprietà dell'oggetto, -valueForKey[Path]: agisce come una forma primitiva di map().

+0

Questo è molto pulito e in realtà realizza ciò che OP vuole a mio parere. Grazie per quello. –