Ответ 1
Это то, что оценивается подзапросом. (Найдено из эта рассылка list thread, №1 для "подзапроса NSPredicate" в Google.) Эта часть документации также объясняет, как с ней связан синтаксис строки предиката.
Кажется, что есть нулевая документация о ключевом слове SUBQUERY от Apple, и я не могу найти простое объяснение об этом в SO или в Google. Это заговор!;)
Пожалуйста, может кто-нибудь из внутреннего круга просто дать краткое объяснение его синтаксиса, чтобы я мог его использовать?
SUBQUERY(Bs, $x, $x IN %@)
Спасибо
Это то, что оценивается подзапросом. (Найдено из эта рассылка list thread, №1 для "подзапроса NSPredicate" в Google.) Эта часть документации также объясняет, как с ней связан синтаксис строки предиката.
И для людей, которые не совсем понимают, что говорит документация, 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
Здесь приведена статья об этом с большим объяснением и примером.
Подзапрос представляет предикат (третий аргумент - $x IN %@
), который оценивается на всех объектах (второй аргумент - $x
- он как имя переменной в foreach) отношения (первый аргумент - Bs
). Аналогично регулярному запросу возвращает список объектов.
Я вижу во многих местах, что люди используют $x
почти догматически, но отношение $object
in objects
также имеет смысл (или $city
в cities
...):)