2011-01-19 10 views

Trả lời

33

Bạn có thể sử dụng NSArray 's enumerateObjectsUsingBlock: nếu bạn đang ở trên OS X 10.6 hoặc iOS 4 .:

NSMutableArray *mapped = [NSMutableArray arrayWithCapacity:[array count]]; 
[array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 
    id mapObj = DoSomethingToObject(obj); 
    [mapped addObject:mapObj]; 
}]; 

(Shameless nhưng có liên quan cắm: Tôi có một library cho OS X và iOS có thêm bản đồ và các chức năng tương tự khác cho NSArrayNSSet.)

+0

Còn về * gasp * iOS 3.x thì sao? – Moshe

+0

@Moshe: Sau đó, bạn sẽ phải thực hiện nó với vòng lặp for. – mipadi

+7

+1 cho liên kết đến thư viện bộ sưu tập của bạn. Đừng được _ashamed_ chia sẻ công việc tốt của bạn, để khóc to! Nó trông giống như một nguồn tài nguyên tuyệt vời. –

8

Bạn tự làm điều đó. Không có phương pháp duy nhất tương đương với những gì bạn muốn.

Chỉnh sửa: Đối với những người downvoting, đây là câu trả lời đúng lúc đó (ba năm trước) và vẫn là dành cho Objective-C, nhưng Swift có chức năng map().

10

Tùy theo. Nếu bạn có, nói, một mảng của các đối tượng, và các đối tượng này có một tài sản URL (ví dụ), sau đó bạn có thể làm:

NSArray * urls = [myArray valueForKey:@"URL"]; 

Tương tự như vậy, nếu bạn có thể kích hoạt các hành vi của các đối tượng trong câu hỏi qua một một thông điệp có thông số 0 hoặc 1, bạn có thể làm:

[myArray makeObjectsPerformSelector:@selector(doFoo)]; 
//or: 
[myArray makeObjectsPerformSelector:@selector(doFooWithBar:) withObject:aBar]; 

Vì bất cứ điều gì ngoài đó, bạn sẽ phải tự mình lặp lại các đối tượng. Bạn có thể sử dụng vòng lặp for(), vòng lặp for(in) hoặc một số thứ như -enumerateObjectsUsingBlock:, v.v.

+0

Công trình này tuyệt vời! 'valueForKey:' hoạt động tốt đẹp với một mảng của NSDictionary quá. –

4

Kiểm tra BlocksKit, nó cung cấp bản đồ, giảm và filer cho NSArray.

  • (NSArray *) map: (BKTransformBlock) block;
  • (id) giảm: (id) ban đầu với khối khóa: (BKAccumulationBlock);
  • (NSArray *) chọn: (BKValidationBlock) chặn;
1

Thể loại chức năng cho NSArray một sự thay thế

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

Thể loại chức năng cho NSMutableArray một sự thay thế

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