Быстрое объяснение SUBQUERY в выражении NSPredicate

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

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

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

Спасибо

Ответы на вопрос(3)

Решение Вопроса

Это то, что оценивает подзапрос. (Найдено изэтот список рассылкихит # 1 для «подзапроса NSPredicate» в Google.) Этот фрагмент документации также объясняет, как к нему относится синтаксис строки формата предиката.

 Pedro Borges04 окт. 2014 г., 15:43
Просто примечание: на данный момент этот пост является первым хитом Google для "nspresicate subquery" :) +1 для ссылки
 jpswain14 янв. 2013 г., 08:12
да только что понял это ... спасибо ;-)
 pieSquared28 сент. 2010 г., 11:09
Черт! Я не могу поверить, что я пропустил это. Большое спасибо.
 Peter Hosey14 янв. 2013 г., 08:11
@ orange80: имя переменной - ваш выбор. Смотрите документацию, на которую я ссылаюсь, в моем ответе. Если вы знаете Python, это все равно что сказать[x for x in collection if (some condition involving x)], Насколько я знаю, имя переменной даже не должно быть одной буквы.
 jpswain14 янв. 2013 г., 08:06
Как вы знаете, какое письмо использовать? В некоторых местах я вижу $ x, в некоторых местах я вижу $ s, в некоторых - $ a, и по контексту не вижу различий между $ x и $ s.

которые не совсем понимают, что говорится в документации,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, [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
 sudo30 авг. 2015 г., 05:05
@cfisher Незначительное исправление: это ошибка времени выполнения, а не ошибка компиляции. (Не пытаясь быть придурком.)
 cfischer14 мая 2015 г., 16:49
Ваш NSPredicate не скомпилируется: поймано «NSInvalidArgumentException», «Невозможно разобрать строку формата« SUBQUERY (SELF, $ a, $ a. @ Count> 2) »»

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

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

Ваш ответ на вопрос