2012-04-05 89 views
9

在iOS中,我想實現NSArray的映射函數。這是一個應用於數組的每個元素的函數。什麼是實施這個最好的方法?NSArray。我如何實現地圖功能?

感謝,
道格

+2

地圖是一個從一件事轉變爲另一件事......你在尋找「foreach」,而不是地圖......說,接受的答案是正確的。 – 2013-06-10 16:35:26

回答

6

您可以使用NSArrayenumerateObjectsUsingBlock:功能。

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

dasblinkenlight是的,先生,我們有一個贏家。這會很好地工作。謝謝你。乾杯。 – dugla 2012-04-06 16:56:09

+24

爲什麼這是一個贏家。一個映射函數應該返回一個新的數組,其中原始數據的每個元素都已經被該塊執行。 enumerateObjectsUsingBlock返回void。 – 2014-05-05 16:13:05

+0

@SaniElfishawy OP所謂的「地圖」與更常見的定義不同:他想要一個「foreach」機制來應用自己的功能(經典「地圖」的第一部分),但他不想收集變換(「地圖」功能的第二部分)。我根據OP對所需功能的描述回答了這個問題,即「這是應用於陣列的每個元素的函數」。 – dasblinkenlight 2014-05-05 16:31:43

6

您正在尋找應用的地圖應該返回一個新的數組與轉化值。

但是,您可以用創建自定義類別的方法來增加NSArray。這裏有兩個例子 - 應用與地圖:

@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

如果您正在使用的Objective-C,你可以簡單地使用這些方法:

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

例如:

[array makeObjectsPerformSelector:@selector(doSomething)];