2015-08-14 6 views
5

Say I NSArray *x = @[@1, @2, @3, @4];Äquivalent von Swifts .map in Objective C?

Jetzt sagen, ich will einen Array wie @[@2, @4, @6, @8]

In guter alter Swift habe, kann ich nur tun:

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

kann mir jemand sagen, wie ich dies in Objective tun kann -C ohne zu tun -

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

?

+1

http://www.openradar.me/radar?id=5364414152704000 (und meine ist ein Duplikat einer viel älteren Anfrage). In Cocoa gibt es heute keine Kartenmethode. –

Antwort

3

NSArray hat keine map Methode. Es hat eine enumerateObjectsUsingBlock: Methode (und verwandte), die etwas ähnliches tun; Sie konvertieren ein Objekt nicht automatisch in ein anderes und geben ein anderes Array zurück, aber Sie können das manuell leicht genug tun. Sie sind jedoch nicht viel anders als Ihr Beispiel.

Ich schrieb eine Bibliothek namens collections, die eine Karte Methode (und andere Sammlungen orientierte Methoden) zu NSArray obwohl fügt hinzu NSDictionary und NSSet.

1

Ich empfehle das nicht unbedingt, aber Sie können einige funky Sachen machen, die Kategorien und Schlüsselwertcodierung verwenden. Zum Beispiel:

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

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

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

Im allgemeinen wird für jede Operation, die als ein Schlüssel oder Schlüsselpfad zu einer Eigenschaft des Objekts ausgedrückt werden kann, -valueForKey[Path]: wirkt als eine primitive Form von map().

+0

Das ist sehr ordentlich und leistet tatsächlich das, was OP meiner Meinung nach will. Dank dafür. –