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:
的方式将 应用 NSExpression
到 NSArray
的内置方法,因此 NSExpression
在这里帮不上什么忙。
不过,您可以使用一些小技巧来解决此问题:
NSString *key = NSStringFromSelector(@selector(objectId));
NSMutableArray *allIds= [[array valueForKey:key] mutableCopy];
如果您在生产代码中使用它,最好通过几行注释对其进行大量记录。否则,你的代码的读者(包括大约六个月后的你)几乎肯定会感到困惑。
这看起来做起来相当简单,但我找不到任何具体引用它的内容。
假设我有一个 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:
的方式将 应用 NSExpression
到 NSArray
的内置方法,因此 NSExpression
在这里帮不上什么忙。
不过,您可以使用一些小技巧来解决此问题:
NSString *key = NSStringFromSelector(@selector(objectId));
NSMutableArray *allIds= [[array valueForKey:key] mutableCopy];
如果您在生产代码中使用它,最好通过几行注释对其进行大量记录。否则,你的代码的读者(包括大约六个月后的你)几乎肯定会感到困惑。