Где найти документацию функции SUBQUERY NSPredicate для Базовых Данных?
Хороший вопрос... кажется, что это не очень хорошо документировано.
Вот что я нашел:
SUBQUERY(collection_expression, variable_expression, predicate);
NSSubqueryExpressionType
, который используется, когда вы указываете SUBQUERY
в предикате. Обновление:
С добавлением расширений приложений Apple включила больше примеров SUBQUERY, поскольку они необходимы для сложной логики сопоставления.
В разделе Сравнение строк руководства Руководство по программированию предикатов теперь есть пример соответствия UTI:
SUBQUERY (
extensionItems,
$extensionItem,
SUBQUERY (
$extensionItem.attachments,
$attachment,
ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "com.adobe.pdf"
).@count == $extensionItem.attachments.@count
).@count == 1
Более сложный пример вы можете найти в разделе Обработка общих сценариев:
SUBQUERY (
extensionItems,
$extensionItem,
SUBQUERY (
$extensionItem.attachments,
$attachment,
ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "org.appextension.action-one" ||
ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "org.appextension.action-two"
).@count == $extensionItem.attachments.@count
).@count == 1
Существует также NSPredicate Cheatsheet, где обсуждается SUBQUERY в дополнение к нескольким другим возможностям NSPredicate.
По сути, каждый SUBQUERY
эквивалентен filter
в Swift. А ANY
эквивалентен contains
.
Так что если взять этот пример снова:
SUBQUERY (
extensionItems,
$extensionItem,
SUBQUERY (
$extensionItem.attachments,
$attachment,
ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "com.adobe.pdf"
).@count == $extensionItem.attachments.@count
).@count == 1
В Swift это будет выглядеть примерно так:
extensionItems.filter {
$0.attachments.filter {
$0.registeredTypeIdentifiers.contains {
$0.utiConformsTo("com.adobe.pdf")
}
}.count == $0.attachments.count
}.count == 1