NSArray。我如何实现Map函数?

10
在iOS中,我想实现对NSArray的地图功能。这是应用于数组每个元素的函数。最佳实现方法是什么? 谢谢, Doug

2
映射是将一件事物转换成另一件事物的过程...你要找的是“foreach”,而不是映射...话虽如此,被接受的答案是正确的。 - Tony K.
3个回答

6
你想要使用apply作为映射时返回一个带有转换后值的新数组。
然而,你可以通过创建自定义类别来增强NSArray中的方法。以下是两个示例 - apply和map:
@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

5
你可以使用NSArrayenumerateObjectsUsingBlock:函数。
[myArray enumerateObjectsUsingBlock:^(id x, NSUInteger index, BOOL *stop) {
    // Body of the function
}];

1
dasblinkenlight,是的先生,我们有一个赢家。这将非常好地发挥作用。谢谢你。干杯。 - dugla
30
为什么这是一个胜利者。一个 map 函数应该返回一个新的数组,其中原始数组的每个元素都经过代码块的处理。enumerateObjectsUsingBlock 返回 void。 - Sani Elfishawy
@SaniElfishawy,OP所谓的“map”与更常见的定义不同:他想要一个“foreach”机制来应用自己的函数(经典“map”的第一部分),但他不想收集转换的结果(“map”功能的第二部分)。我根据OP对所需功能的描述回答了这个问题,即“这是应用于数组每个元素的函数”。 - Sergey Kalinichenko

0
如果你正在使用Objective-C,你可以直接使用这些方法:
- (void)makeObjectsPerformSelector:(SEL)aSelector;
- (void)makeObjectsPerformSelector:(SEL)aSelector withObject:(nullable id)argument;

例如:

[array makeObjectsPerformSelector:@selector(doSomething)];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接