如果我有自定义对象的NSArray(在本例中为Core Data对象),我如何将特定属性的所有项放在另一个NSArray中。有没有办法可以使用积木?
例如,如果类是People,并且其中一个属性是age,并且人数组中有五个对象,那么最终的NSArray将只显示年龄:
{ 12, 45, 23, 43, 32 }
订单并不重要。
答案 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
,而不是int
或NSInteger
。
答案 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];
}