gpt4 book ai didi

iphone - NSPredicate 嵌套关系

转载 作者:可可西里 更新时间:2023-11-01 03:35:54 24 4
gpt4 key购买 nike

我正在尝试使用 NSPredicate 过滤对象的可变数组,但在访问包含我要过滤的属性的级别时遇到问题。

给出一个由相似的自定义对象组成的简化示例。

  • 祖 parent
  • 家长
  • child

我有一个祖 parent 的 NSMutableArray,我想找到所有具有 10 岁孙子的祖 parent 对象。因此,孙子们从根上深了两层。 Child 具有 age 属性等。

即。祖 parent 有一个数组属性 Parents and Parents 有一个数组属性 Children 和 Children 有一个整数属性 age。

以下 NSPredicate 未返回任何结果。 “SELF.parents.children.age == 10”

我意识到,由于这些是嵌套集合,因此这个谓词可能是错误的处理方式,但我对如何访问该级别感到困惑。也许通过子查询或集合运算符,但我无法解决。

要记住的一件事是,我显然仍然想要有多个不同年龄的孙辈的祖 parent ,其中一个是 10 岁。

最佳答案

“显而易见”的解决方案是谓词:

"ANY parents.children.age == 10"

但是,“ANY”运算符不适用于嵌套的对多关系。因此,您需要一个子查询:

NSArray *grandParents = your array of GrandParent objects;
NSPredicate *predicate = [NSPredicate
predicateWithFormat:@"SUBQUERY(parents, $p, ANY $p.children.age == 10).@count > 0"];
NSArray *filtered = [grandParents filteredArrayUsingPredicate:predicate];

备注:

  • 不必在谓词中使用SELFfilteredArrayUsingPredicate 应用数组中每个 GrandParent 对象的谓词。
  • 在谓词中使用 SUBQUERY 的记录似乎很少。有 one example在 NSExpression 类引用中。另见 Quick Explanation of SUBQUERY in NSPredicate Expression .
  • 在这种情况下,SUBQUERY 中的谓词应用于单个 GrandParent 的每个 Parent。 SUBQUERY 返回拥有任何 10 岁 child 的 parent 。所以 "SUBQUERY(...).@count > 0" 如果祖 parent 至少有一位 parent 有任何 10 岁的 child ,则计算结果为 TRUE。

ADDED:我刚刚发现它实际上可以在没有 SUBQUERY 的情况下完成:

NSPredicate *predicate = [NSPredicate
predicateWithFormat:@"ANY parents.@unionOfArrays.children.age == 10"];

有效并给出了预期的结果。 (它可能不如 SUBQUERY 有效,但我没有测试它。)

关于iphone - NSPredicate 嵌套关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16856933/

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