NSPredicate表达式中SUBQUERY的快速解释

时间:2010-09-28 08:36:44

标签: iphone cocoa cocoa-touch subquery nspredicate

似乎没有关于Apple的SUBQUERY关键字的文档,我在SO或Google上找不到关于它的简单解释。这是一个阴谋! ;)

,来自内圈的人是否可以快速解释其语法,以便我可以使用它?

SUBQUERY(Bs, $x, $x IN %@)

由于

3 个答案:

答案 0 :(得分:41)

对于那些不太了解文档内容的人来说,SUBQUERY基本上是这样的:

SUBQUERY(collection, variableName, predicateFormat)

可以(简单地)实现这样:

id resultingCollection = ...; //a new collection, either a mutable set or array
NSMutableDictionary * substitutions = [NSMutableDictionary dictionary];
NSPredicate * p = [NSPredicate predicateWithFormat:predicateFormat];
for (id variable in collection) {
  [substitutions setObject:variable forKey:variableName];
  NSPredicate * filter = [p predicateWithSubstitutionVariables:substitutions];
  if ([filter evaluateWithObject:collection] == YES) {
    [resultingCollection addObject:variable];
  }
}
return resultingCollection;

简而言之,SUBQUERY基本上是根据SUBQUERY的谓词表达式获取对象集合并过滤掉各种对象,并返回结果集合。 (并且谓词本身可以包含其他SUBQUERY s)

示例:

NSArray * arrayOfArrays = [NSArray arrayWithObjects:
                           [NSArray arrayWithObjects:....],
                           [NSArray arrayWithObjects:....],
                           [NSArray arrayWithObjects:....],
                           [NSArray arrayWithObjects:....],
                           [NSArray arrayWithObjects:....],
                           [NSArray arrayWithObjects:....],
                           nil];
NSPredicate * filter = [NSPredicate predicateWithFormat:@"SUBQUERY(SELF, $a, $a.@count > 42)"];
NSArray * filtered = [arrayOfArrays filteredArrayUsingPredicate:filter];
//"filtered" is an array of arrays
//the only arrays in "filtered" will have at least 42 elements each

答案 1 :(得分:21)

This is what a subquery evaluates to.(来自this mailing list thread,是Google中“NSPredicate子查询”的第一名。)这些文档还解释了谓词格式字符串语法与它的关系。

答案 2 :(得分:0)

子查询表示一个谓词(第三个参数 - $x IN %@),它在所有对象上进行评估(第二个参数 - $x - 它类似于foreach中的变量名称)关系(首先参数 - Bs)。与常规查询类似,返回对象列表。

我在很多地方都看到人们使用$x几乎是教条,但$object objects关系中的$city也很有意义(或cities {{1}} ......):)