2012-04-05 12 views
9

W iOS chcę zaimplementować funkcję map dla NSArray. Jest to funkcja, która jest stosowana do każdego elementu tablicy. Jaki jest najlepszy sposób wdrożenia tego?NSArray. Jak mogę zaimplementować funkcję Map?

Dzięki
Doug

+2

Mapa jest przekształcić z jednej rzeczy na drugą ... szukasz "foreach", nie map ... powiedział, że zaakceptowana odpowiedź jest poprawna. –

Odpowiedz

6

Można użyć enumerateObjectsUsingBlock: funkcję NSArray.

[myArray enumerateObjectsUsingBlock:^(id x, NSUInteger index, BOOL *stop) { 
    // Body of the function 
}]; 
+1

dasblinkenlight tak sir mamy zwycięzcę. To zadziała całkiem nieźle. Dzięki za to. Twoje zdrowie. – dugla

+24

Dlaczego to jest zwycięzca. Funkcja map powinna zwrócić nową tablicę, w której każdy element oryginału został wykonany przez blok. enumerateObjectsUsingBlock zwraca wartość void. –

+0

@SaniElfishawy To, co OP nazywa "mapą", różni się od bardziej powszechnej definicji: chciał, aby mechanizm "foreach" stosował swoją własną funkcję (pierwsza część klasycznej "mapy"), ale nie chciał zbierać wyników transform (druga część funkcjonalności "map"). Odpowiedziałem na pytanie oparte na opisie OP pożądanej funkcjonalności, tj. "Jest to funkcja, która jest stosowana do każdego elementu tablicy." – dasblinkenlight

6

Szukasz aplikacji, ponieważ mapa powinna zwrócić nową tablicę z przekształconymi wartościami.

Można jednak rozszerzyć NSArray o metody, których szukasz, tworząc kategorię niestandardową. Oto dwa przykłady - zastosowanie i mapa:

@implementation NSArray (CMMap) 
- (NSArray *) map:(id(^)(id obj))block { 
    NSMutableArray *a = @[].mutableCopy; 
    for (id o in self) { 
     id on = block(o); 
     if (!on) { 
      NSLog(@"NSArray::map() - object returned by block is nil!"); 
      abort(); 
     } 
     [a addObject: on]; 
    } 
    return [NSArray arrayWithArray: a]; 
} 

- (void) apply:(void(^)(id obj))block { 
    for (id o in self) { 
     block(o); 
    } 
} 
@end 
0

Jeśli używasz Objective-C, można po prostu użyć następujących metod:

- (void)makeObjectsPerformSelector:(SEL)aSelector; 
- (void)makeObjectsPerformSelector:(SEL)aSelector withObject:(nullable id)argument; 

Na przykład:

[array makeObjectsPerformSelector:@selector(doSomething)]; 
Powiązane problemy