在Objective-C中,是否有类似Swift中的.map方法?

5

假设我有一个NSArray *x = @[@1, @2, @3, @4];

现在,我想要一个类似于@[@2, @4, @6, @8]的数组

使用好用的Swift,我只需要执行以下操作:

xDoubled = x.map({($0) * 2})

有人可以告诉我如何在Objective-C中完成这个操作而不使用-吗?
NSMutableArray *xDoubled = [NSMutableArray new];
for (NSInteger xVal in x) {
    [xDoubled addObject:xVal * 2];
}

?


1
http://www.openradar.me/radar?id=5364414152704000(而我的是一个较旧请求的重复)。Cocoa今天没有map方法。 - Rob Napier
2个回答

3

NSArray 没有 map 方法。它有一个 enumerateObjectsUsingBlock: 方法(及相关方法),可以实现类似的功能;它们不会自动将一个对象转换为另一个并返回另一个数组,但你可以很容易地手动完成这个过程。然而,它们与你的示例并没有太大的区别。

我写了一个名为 collections 的库,它向 NSArrayNSDictionaryNSSet 添加了 map 方法(以及其他集合导向的方法)。


1

我不一定建议这样做,但你可以利用分类和键值编码来实现一些有趣的功能。例如:

@interface NSNumber (DoubledValue)
- (NSNumber*) doubledValue;
@end

@implementation NSNumber (DoubledValue)
- (NSNumber*) doubledValue
{
    return @([self doubleValue] * 2);
}
@end

xDoubled = [x valueForKey:@"doubledValue"];

通常,对于任何可以表示为对象属性的键或键路径的操作,-valueForKey[Path]: 作为 map() 的原始形式。

这非常整洁,我认为实际上实现了OP想要的东西。谢谢。 - raven_raven

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