NSPredicate从数组中的多个对象获取单个属性

时间:2015-10-20 17:14:41

标签: objective-c nsarray nspredicate

这似乎相当简单,但我找不到任何具体引用它的东西。

假设我有一组Post个对象,每个对象都有一个objectId。如何创建仅包含objectId的数组?

类似的东西:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"objectId ALL"]; // I just want all the objectIds...
NSArray *results = [[self.objects filteredArrayUsingPredicate:predicate] mutableCopy];

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"objectId matches {anything}"];

2 个答案:

答案 0 :(得分:1)

NSPredicate无法返回BOOL以外的任何内容,因此无法返回objectId。此外,filteredArrayUsingPredicate:可以更改数组中的项目数,但它会保持对象本身不变。

如果您想从一个对象开始并生成另一个对象,则需要NSExpression。它可以将您的对象转换为其他对象 - 例如,通过投影其中一个属性。但是,Cocoa没有以与NSExpression类似的方式提供 NSArray应用于filteredArrayUsingPredicate:的内置方式,因此NSExpression无效这里。

你可以通过一个小技巧来解决这个问题:

NSString *key = NSStringFromSelector(@selector(objectId));
NSMutableArray *allIds= [[array valueForKey:key] mutableCopy];

如果您在生产代码中使用它,最好通过几行注释对其进行大量记录。否则,您的代码的读者(包括您在大约六个月左右的时间)几乎可以保证混淆。

答案 1 :(得分:0)

好的,事实证明这不是NSPredicate的任务,这就是为什么我无法找到如何使用它。相反,我可以通过键值编码(KVC)很容易地做到这一点。

如果你想简单地检索一些东西而不是过滤,那么:

NSArray *results = [self.objects valueForKey:@"objectId"];