2011-01-19 4 views

Odpowiedz

33

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.)

+0

Co ze * sapnięciem * iOS 3.x? – Moshe

+0

@Moshe: Będziesz musiał to zrobić za pomocą pętli for. – mipadi

+7

+1 dla linku do Twojej biblioteki kolekcji. Nie bądźcie wdzięczni za dzielenie się swoją dobrą pracą, za głośne wołanie! Wygląda jak wielki zasób. –

8

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ę.

10

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

+0

Działa to świetnie! 'valueForKey:' działa również z tablicą NSDictionary. –

4

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);
1

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; 
}