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

NSPredicate to get a single attribute back from multiple objects in an array

这看起来做起来相当简单,但我找不到任何具体引用它的内容。

假设我有一个 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}"];

好的,事实证明这不是 NSPredicate 的任务,这就是为什么我找不到如何使用它来完成它的原因。相反,我可以使用键值编码 (KVC) 非常轻松地完成此操作。

如果您只想检索某些内容而不进行过滤,那么:

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

NSPredicate 不能 return 除了 BOOL 之外的任何东西,所以它不能 return objectId。此外,filteredArrayUsingPredicate: 可以更改数组中项目的数量,但它会保持对象本身不变。

如果你想从一个对象开始并产生另一个对象,你需要NSExpression。它可以将您的对象转换成其他东西——例如,通过投射它的一个属性。但是,Cocoa 没有提供以类似于 filteredArrayUsingPredicate: 的方式将 应用 NSExpressionNSArray 的内置方法,因此 NSExpression 在这里帮不上什么忙。

不过,您可以使用一些小技巧来解决此问题:

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

如果您在生产代码中使用它,最好通过几行注释对其进行大量记录。否则,你的代码的读者(包括大约六个月后的你)几乎肯定会感到困惑。