DocumentModel
contains tags relationship to TagModel
. A View receives selectedTag. Predicate (as part of @Query) should filter documents that have given tag.
let selectedTag = TagModel()
#Predicate<DocumentModel> { document in
document.tags.contains {
$0.tagID == selectedTag.tagID
}
}
Predicate doesn’t build because: Cannot convert to closure result type ‘any StandardPredicateExpression’.
Predicate macro expands to:
Foundation.Predicate<DocumentModel>({ document in
PredicateExpressions.build_contains(
PredicateExpressions.build_KeyPath(
root: PredicateExpressions.build_Arg(document),
keyPath: .tags
)
) {
PredicateExpressions.build_Equal(
lhs: PredicateExpressions.build_KeyPath(
root: PredicateExpressions.build_Arg($0),
keyPath: .tagID
),
rhs: PredicateExpressions.build_KeyPath(
root: PredicateExpressions.build_Arg(selectedTag),
keyPath: .tagID
)
)
}
})
Full error message:
Cannot convert value of type 'PredicateExpressions.SequenceContainsWhere<PredicateExpressions.KeyPath<PredicateExpressions.Variable<DocumentModel>, [TagModel]>, PredicateExpressions.Equal<PredicateExpressions.KeyPath<PredicateExpressions.Variable<TagModel>, String>, PredicateExpressions.KeyPath<PredicateExpressions.Value<TagModel>, String>>>' to closure result type 'any StandardPredicateExpression<Bool>'
Apple Developer Documentation has example code using contains()
and comparing strings:
let messagePredicate = #Predicate<Message> { message in
message.recipients.contains {
$0.firstName == message.sender.firstName
}
}
How to filter documents that contain selected tag?