AppleからのSUBQUERYキーワードに関するドキュメントはゼロのようですが、SOまたはGoogleでは、簡単な説明が見つかりません。これは陰謀です。 !;)
お願い、内側のサークルの誰かがその構文の簡単な説明を提供して、私がそれを使用できるようにしてくれませんか?
SUBQUERY(Bs, $x, $x IN %@)
ありがとう
これはサブクエリの評価です。 ( このメーリングリストスレッド から見つかりました。Googleの「NSPredicateサブクエリ」のヒット数1位です。)このドキュメントでは、その方法についても説明しています。述語フォーマット文字列構文はそれに関連しています。
そして、ドキュメントが言っていることを完全に理解していない人にとって、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
サブクエリは、関係(最初の引数-Bs
)のすべてのオブジェクト(2番目の引数-$x IN %@
- foreachの変数名のようなもの)で評価される述語(3番目の引数-$x
)を表します。通常のクエリと同様に、オブジェクトのリストを返します。
多くの場所で、人々が$x
をほぼ独断的に使用しているのを目にしますが、objects
関係の$object
も完全に理にかなっています(またはcities
...の$city
):)