NSPredicateexpression式中SUBQUERY的快速说明
似乎没有关于苹果的SUBQUERY关键字的文档,我无法在SO或Google上find关于它的简单解释。 这是一个阴谋! ;)
请问内圈的人可否提供一个简单的语法解释,以便我可以使用它?
SUBQUERY(Bs, $x, $x IN %@)
谢谢
这是一个子查询评估的内容。 (从这个邮件列表线程find,#1命中谷歌“NSPredicate子查询”)。这一点的文档还解释了谓词格式string语法如何与它相关联。
而对于那些不太清楚文档内容的人来说, 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
的谓词expression式来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
这里有一个很好的解释和例子的文章。
子查询代表一个关系(第一个参数 – Bs
)的所有对象(第二个参数 – $x
– 就像foreach中的一个variables名)上的谓词(第三个参数 – $x IN %@
)。 与常规查询类似,返回对象列表。
我在很多地方看到人们几乎用教条式使用$x
,但是在objects
关系中的$object
也是完全合理的(或者$city
中的$city
):)