【问题标题】:Getting an NSArray of a single attribute from an NSArray从 NSArray 获取单个属性的 NSArray
【发布时间】:2011-05-11 18:14:34
【问题描述】:

我正面临一个非常常规的场景。

我有一个 NSArray,它有一个自定义类型的对象,比如 Person。 Person 类具有以下属性:firstName、lastName 和 age。

如何从具有 Person 对象的 NSArray 中获取仅包含一个属性的 NSArray?

类似:

NSArray *people;
NSArray *firstNames = [people getArrayOfAttribute:@"firstName" andType:Person.Class]

我有一个解决方案,可以编写一个 for 循环并填写 firstNames 数组,但我不想这样做。

【问题讨论】:

  • 是不是类似于字典数组
  • 为什么不想循环数组?
  • 我不想手动循环数组只是为了节省代码行并以优雅的方式实现我正在处理的东西。

标签: iphone objective-c ios4 iphone-sdk-3.0 cocoa-design-patterns


【解决方案1】:

NSArray 将使用 KVC 为您处理此问题

NSArray *people ...;
NSArray *firstName = [people valueForKey:@"firstName"];

这将为您提供数组中每个条目的 firstName 值的数组

【讨论】:

    【解决方案2】:

    查看 NSMutableArray 中的 filterUsingPredicate: 方法,基本上你创建一个 NSPredicate 对象来定义如何过滤数组。

    http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Predicates/Articles/pUsing.html#//apple_ref/doc/uid/TP40001794-CJBDBHCB

    本指南将为您提供概述,并有一个处理数组的部分。

    【讨论】:

    • +1:这是正确的,但除非它是一个庞大的数组,否则只需使用 for 循环就可以工作,并且没有使用 Predicates 的麻烦。
    • 他的问题不是关于过滤数组,而是关于从数组中的一个键值创建一个数组。
    【解决方案3】:

    你也可以使用基于块的枚举:

    NSArray *people;  // assumably has a bunch of people
    NSMutableArray *firstNames = [NSMutableArray array];
    
    [people enumerateObjectsUsingBlock: 
     ^(id obj, NSUInteger idx, BOOL*flag){
         // filter however you want...
         [firstNames addObject:[Person firstName]];
     }];
    

    如果你有一群人,它的好处是快速高效......

    【讨论】:

    • 酷。我忘记了 KVC 会这样做。谢谢你的提醒。 (已投票)
    猜你喜欢
    • 2015-10-25
    • 2012-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-16
    • 2010-10-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多