2012-04-05 19 views
9

Trong iOS, tôi muốn triển khai chức năng bản đồ cho NSArray. Đây là một hàm được áp dụng cho mọi phần tử của mảng. Cách tốt nhất để thực hiện điều này là gì?NSArray. Làm cách nào để triển khai chức năng Bản đồ?

Cảm ơn,
Doug

+2

Map là một biến đổi từ vật này sang vật khác ... bạn đang tìm kiếm "foreach", không phải bản đồ ... mà nói, câu trả lời được chấp nhận là đúng. –

Trả lời

6

Bạn có thể sử dụng chức năng của enumerateObjectsUsingBlock:NSArray.

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

dasblinkenlight vâng, chúng tôi có một người chiến thắng. Điều đó sẽ hoạt động khá độc đáo. Cám ơn vì cái này. Chúc mừng. – dugla

+24

Tại sao đây lại là một người chiến thắng. Một hàm bản đồ sẽ trả về một mảng mới trong đó mỗi phần tử của bản gốc đã được tác động bởi khối. enumerateObjectsUsingBlock trả về void. –

+0

@SaniElfishawy Những gì OP gọi là "bản đồ" khác với định nghĩa phổ biến hơn: ông muốn có cơ chế "foreach" để áp dụng chức năng của chính mình (phần đầu tiên của "bản đồ" cổ điển) nhưng ông không muốn thu thập kết quả của chuyển đổi (phần thứ hai của chức năng "bản đồ"). Tôi đã trả lời câu hỏi dựa trên mô tả của OP về chức năng mong muốn, tức là "Đây là một hàm được áp dụng cho mọi phần tử của mảng". – dasblinkenlight

6

Bạn đang tìm cách áp dụng vì bản đồ sẽ trả về một mảng mới với các giá trị được chuyển đổi.

Tuy nhiên bạn có thể tăng NSArray bằng các phương pháp bạn tìm kiếm bằng cách tạo danh mục tùy chỉnh. Dưới đây là hai ví dụ - áp dụng và bản đồ:

@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

Nếu bạn đang sử dụng Objective-C, bạn chỉ có thể sử dụng các phương pháp:

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

Ví dụ:

[array makeObjectsPerformSelector:@selector(doSomething)]; 
Các vấn đề liên quan