Подтвердить что ты не робот

Краткое пояснение SUBQUERY в выражении NSPredicate

Кажется, что есть нулевая документация о ключевом слове SUBQUERY от Apple, и я не могу найти простое объяснение об этом в SO или в Google. Это заговор!;)

Пожалуйста, может кто-нибудь из внутреннего круга просто дать краткое объяснение его синтаксиса, чтобы я мог его использовать?

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

Спасибо

4b9b3361

Ответ 2

И для людей, которые не совсем понимают, что говорит документация, 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, [email protected] > 42)"];
NSArray * filtered = [arrayOfArrays filteredArrayUsingPredicate:filter];
//"filtered" is an array of arrays
//the only arrays in "filtered" will have at least 42 elements each

Ответ 3

Здесь приведена статья об этом с большим объяснением и примером.

Ответ 4

Подзапрос представляет предикат (третий аргумент - $x IN %@), который оценивается на всех объектах (второй аргумент - $x - он как имя переменной в foreach) отношения (первый аргумент - Bs). Аналогично регулярному запросу возвращает список объектов.

Я вижу во многих местах, что люди используют $x почти догматически, но отношение $object in objects также имеет смысл (или $city в cities...):)