【问题标题】:iOS -- mapping a method to an arrayiOS——将方法映射到数组
【发布时间】:2011-07-23 07:46:24
【问题描述】:

在 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];  

【问题讨论】:

  • 值得花时间将该方法写成一个类别……

标签: iphone objective-c arrays ios map


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    看看-[NSArray filteredArrayUsingPredicate:]

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

    编辑 2:另一种可能性是 -valueForKey:,当应用于数组时,将返回一个数组,其中包含将 -valueForKey: 发送到数组中的对象的结果。但是,对象必须再次响应给定键的 -valueForKey:。

    【讨论】:

    • 不一样;它使用谓词筛选数组中的对象。它不会改变它们。
    【解决方案3】:

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

    在性能改进方面,改变

    [[NSMutableArray alloc] init];
    

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-23
      • 2018-07-09
      • 1970-01-01
      • 1970-01-01
      • 2020-01-18
      • 2016-01-27
      相关资源
      最近更新 更多