将实体对象组中的单个属性放入数组中

时间:2011-08-29 16:56:58

标签: iphone objective-c ios nsarray objective-c-blocks

如果我有自定义对象的NSArray(在本例中为Core Data对象),我如何将特定属性的所有项放在另一个NSArray中。有没有办法可以使用积木?

例如,如果类是People,并且其中一个属性是age,并且人数组中有五个对象,那么最终的NSArray将只显示年龄:

{ 12, 45, 23, 43, 32 }

订单并不重要。

2 个答案:

答案 0 :(得分:2)

编辑我已经添加了基于块的实现以及基于选择器的实现。

你正在寻找的是与功能世界中的“地图”功能相当的东西(不幸的是,Cocoa不支持这种功能):

@interface NSArray (FunctionalUtils)
- (NSArray *)mapWithSelector:(SEL)selector;
- (NSArray *)mapWithBlock:(id (^)(id obj))block;
@end

实施:

@implementation NSArray (FunctionalUtils)

- (NSArray *)mapWithSelector:(SEL)selector {
  NSMutableArray *result = [[NSMutableArray alloc] initWithCapacity:[self count]];
  for (id object in self) {
    [result addObject:[object performSelector:selector]];
  }
  return [result autorelease];
}

- (NSArray *)mapWithBlock:(id (^)(id obj))block {
  NSMutableArray *result = [[NSMutableArray alloc] initWithCapacity:[self count]];
  for (id object in self) {
    [result addObject:block(object)];
  }
  return [result autorelease];
}

@end

现在,当你需要从人们“映射”到他们的年龄时,你可以这样做:

ages = [people mapWithSelector:@selector(age)];

OR

ages = [people mapWithBlock:^(Person *p) { return [p age]; }];

结果ages将是一个仅包含人口年龄的新NSArray。通常,这适用于您可能需要的任何类型的简单映射操作。

一个警告:由于它返回NSArray,因此ages中的元素应为NSNumber,而不是普通的旧整数。因此,为了实现此目的,您的-age选择器应该返回NSNumber,而不是intNSInteger

答案 1 :(得分:1)

假设每个对象都有一个名为“age”的方法,它返回一个NSNumber *,你应该可以执行以下操作:

-(NSArray *)createAgeArray:(NSArray *)peopleArray {
    NSMutableArray *result = [[NSMutableArray alloc] initWithCapacity:[peopleArray count]];
    [peopleArray enumerateObjectsUsingBlock:^(id person, NSUInteger i, BOOL *stop) {
        [result addObject:[person age]];
    }];
    return [result autorelease];
}