Filtering data with predicates
To filter data in SwiftData, we use the #
Predicate
macro.
The same macro is used to filter data loaded with @Query
, and also when selecting data to be deleted with delete(model:)
.
For instance, if we had a database with albums of songs by bands, we could write a query such as this one to filter all the albums of the Beatles:
@Query(filter: #Predicate<Album> { album in album.band.name == "The Beatles" }) var albums: [Album]
To allow the compiler to correctly handle the type information, with #Predicate
, you need to identify the data type of the queried information, in our example, Album
.
#Predicate
is a macro that converts Swift code into a number of PredicateExpression
objects. The predicate is checked at compile time for type safety, unlike NSPredicate
from Core Data.
At the moment of writing, the process is not perfect, and #Predicate
does not support all the features and operations...