web-dev-qa-db-ja.com

NSPredicate式のSUBQUERYの簡単な説明

AppleからのSUBQUERYキーワードに関するドキュメントはゼロのようですが、SOまたはGoogleでは、簡単な説明が見つかりません。これは陰謀です。 !;)

お願い、内側のサークルの誰かがその構文の簡単な説明を提供して、私がそれを使用できるようにしてくれませんか?

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

ありがとう

28
pieSquared

これはサブクエリの評価です。このメーリングリストスレッド から見つかりました。Googleの「NSPredicateサブクエリ」のヒット数1位です。)このドキュメントでは、その方法についても説明しています。述語フォーマット文字列構文はそれに関連しています。

21
Peter Hosey

そして、ドキュメントが言っていることを完全に理解していない人にとって、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の述語式に基づいてさまざまなオブジェクトを除外し、結果のコレクションを返します。 (そして、述語自体は他のSUBQUERYsを含むことができます)

例:

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
41
Dave DeLong

サブクエリは、関係(最初の引数-Bs)のすべてのオブジェクト(2番目の引数-$x IN %@- foreachの変数名のようなもの)で評価される述語(3番目の引数-$x)を表します。通常のクエリと同様に、オブジェクトのリストを返します。

多くの場所で、人々が$xをほぼ独断的に使用しているのを目にしますが、objects関係の$objectも完全に理にかなっています(またはcities...の$city):)

0
Maciek Czarnik