Jaki jest celowy odpowiednik funkcji JS map()
? Czy po prostu użyć NSFastEnumeration i zastosować funkcję samodzielnie?Jaki jest ekwiwalent Objective-C funkcji `map()` JS?
Odpowiedz
Można użyć NSArray
„s enumerateObjectsUsingBlock:
jeśli jesteś na OS X 10.6 lub iOS 4 .:
NSMutableArray *mapped = [NSMutableArray arrayWithCapacity:[array count]];
[array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
id mapObj = DoSomethingToObject(obj);
[mapped addObject:mapObj];
}];
(Shameless ale odpowiednie wtyczki: Mam library dla OS X i iOS, który dodaje mapę i inne podobne funkcje do NSArray
i NSSet
.)
Zrobisz to sam. Nie ma jednej metody równoważnej z tym, czego chcesz.
Edit: Dla tych downvoting była to poprawna odpowiedź w tym czasie (trzy lata temu) i nadal jest dla Objective-C, ale Swift ma map()
funkcję.
To zależy. Jeśli, powiedzmy, tablicę obiektów, a obiekty te mają URL
własności (na przykład), to można zrobić:
NSArray * urls = [myArray valueForKey:@"URL"];
Podobnie, jeśli można wywołać zachowanie obiektów w pytaniu za pośrednictwem pojedynczy komunikat, że trwa parametrów 0 lub 1, można zrobić:
[myArray makeObjectsPerformSelector:@selector(doFoo)];
//or:
[myArray makeObjectsPerformSelector:@selector(doFooWithBar:) withObject:aBar];
do niczego poza tym, musisz iteracyjne nad yourself obiektów. Można użyć for()
pętlę, a for(in)
pętlę, lub coś podobnego -enumerateObjectsUsingBlock:
itd
Działa to świetnie! 'valueForKey:' działa również z tablicą NSDictionary. –
Sprawdź BlocksKit, dostarcza mapę, zmniejszyć i filer dla NSArray.
- (NSArray *) mapę (BKTransformBlock) bloku;
- (id) zmniejszyć: (id) początkowy blokBlock: (blok BKaskumblacji);
- (NSArray *) select: (blok BKValidationBlock);
Kategoria funkcja NSArray alternatywą
- (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;
}
Kategoria funkcja NSMutableArray alternatywą
- (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;
}
Jest zbudowany przy użyciu Swift, tylko 3 i pół roku po zadałeś to pytanie. – ArtOfWarfare