2011-03-26 87 views
1

iOS中有更简洁的方法来执行以下操作吗?iOS - 将方法映射到数组

假设我们有:

NSArray *existingArray; 

,也是我们的目标自我有可以采取的对象existingArray作为输入并返回类Foo的对象的方法的someMethod。我们可以通过在existingArray应用的someMethod的对象创建一个新的数组* derivedArray如下:

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

我的问题是,有没有更简洁的方式来做到这一点?例如:

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

值得花时间写出该方法作为一个类别... – FeifanZ 2011-03-26 01:37:00

回答

3

不是。有一个makeObjectsPerformSelector:方法(和一些其他相关的方法),但没有一个允许您从调用中获得结果。当然,你可以在NSArray上添加你的方法作为一个类别,但是Apple没有提供这样的方法。

在性能提升方面,改变

[[NSMutableArray alloc] init]; 

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

这将允许阵列用于一次性对象的分配,而不是重新分配每次添加的时间记忆,目的。

0

看看-[NSArray filteredArrayUsingPredicate:]

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

编辑2:另一种可能性是-valueForKey:,它应用于数组时将返回发送-valueForKey:到数组中对象的结果数组。不过,对象必须响应给定键的-valueForKey:。

+0

这是不同的;它使用谓词筛选数组中的对象。它不会改变它们。 – 2011-03-26 01:41:22

2

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

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