iOS - 将方法映射到数组

时间:2011-03-26 01:31:13

标签: iphone objective-c arrays ios map

有没有更简洁的方法在iOS中执行以下操作?

假设我们有:

NSArray *existingArray;

并且我们的对象self也有一个方法someMethod,它可以将existingArray中的对象作为输入并返回类Foo的对象。我们可以通过将someMethod应用于existingArray中的对象来创建一个新的数组* derivedArray,如下所示:

NSMutableArray *derivedArray = [[NSMutableArray alloc]init];
for (id obj in existingArray) {
  [derivedArray addObject: [self someMethod: obj]];
}

我的问题是,有更简洁的方法吗?类似的东西:

NSArray *derivedArray = [existingArray arrayByMappingMethod: someMethod withObject: self];  

3 个答案:

答案 0 :(得分:3)

没有。有一个makeObjectsPerformSelector:方法(以及其他一些相关的方法),但没有一个允许您从调用中获得结果。当然,您可以将您的方法添加为NSArray上的类别,但Apple没有提供执行此操作的方法。

在性能改进方面,请更改

[[NSMutableArray alloc] init];

[[NSMutableArray alloc] initWithCapacity:[existingArray count]];

这将允许数组一次为所有对象分配内存,而不是每次添加对象时重新分配。

答案 1 :(得分:2)

Inspire48的评论可能是最好的主意。如果您的目标是iOS 4+,Mike Ash会在GitHub上提供一些collection utilities。它包括一个地图方法。

它需要iOS 4,因为它利用了阻止。

答案 2 :(得分:0)

查看-[NSArray filteredArrayUsingPredicate:]

编辑:我可能对你的-someMethod:方法做了太多假设。我猜测它测试obj并返回obj或nil,但只是意识到它可以很容易地返回完全不同的东西。那么,另一个可能的答案是-[NSArray makeObjectsPerformSelector:],但这需要obj的类包含-someMethod而不是执行此过滤的对象。

编辑2:还有一种可能性是-valueForKey :,当应用于数组时,它会将结果数组从发送-valueForKey:返回到数组中的对象。但是,对于给定的密钥,对象必须响应-valueForKey: