iphone – NSPredicate嵌套关系

我试图使用NSPredicate过滤可变数组的对象,并且无法访问包含我想要过滤的属性的级别.

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

>祖父母
>家长
>孩子

我有一个祖父母的NSMutableArray,我想找到所有拥有10岁GrandChildren的祖父母物品.
因此,孙子孙女从根本上深入两层.孩子有其他年龄属性.

即.祖父母有一个阵列属性父母和父母有一个阵列属性儿童和儿童有一个整数属性年龄.

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

我意识到,由于这些是嵌套集合,这个谓词可能是错误的方式,但我仍然坚持如何访问该级别.也许通过子查询或集合运算符,但我无法解决它.

要记住的一件事是,我显然仍然希望有多个不同年龄的孙子孙女的祖父母,其中一个年龄为10岁.

最佳答案
作为Martin R的答案的替代方案,您可以考虑使用块谓词.像这样的东西:

NSPredicate *predicate = [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary * bindings) {
  GrandParent *grandparent = evaluatedObject;
  for (Parent *parent in grandparent.parents)
    for (Child *child in parent.children)
      if (child.age == 10)
        return YES
  return NO;
}];

假设GrandParent,Parent和Child是各种对象的适当类名.

我个人更喜欢这种形式,因为我总是觉得我用字符串谓词在代码中混合语言,我认为这使得它的可读性降低.尽管如此,选择显然取决于你.

更新:重新阅读问题后,我现在意识到这种情况比我原先想象的要复杂得多.我已经更新了我对父母和孩子的回答,但Martin R的答案现在显然要简单得多.这仍然是一个可能的解决方案.

转载注明原文:iphone – NSPredicate嵌套关系 - 代码日志