gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 20:43:54 24 4
gpt4 key购买 nike

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

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

{ 12, 45, 23, 43, 32 }

顺序不重要。

最佳答案

编辑 我也添加了基于 block 的实现以及基于选择器的实现。

您正在寻找的是与函数世界中的“ map ”函数等效的东西(不幸的是,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)];

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

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

一个警告:因为它返回一个NSArray,所以ages中的元素应该是NSNumber,而不是一个普通的旧整数。因此,要使其正常工作,您的 -age 选择器应该返回一个 NSNumber,而不是 intNSInteger

关于iphone - 将一组实体对象中的单个属性放入数组中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7233235/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com