有没有更简洁的方法在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];
答案 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: