Post

9-SwiftData Dynamically Query Filter

According to Dynamically filtering our SwiftData query,

Predicate still needs the value to be directly inlined as a constant!

These two not work!

1
2
3
4
5
6
7
8
9
10
enum DayPhase {
    case morning
    case night

    static var morningRawValue: String {
        DayPhase.morning.rawValue
    }

    static let morningRawValue = "morning"
}
1
@Query(filter: #Predicate<FoodLog> { ($0.occurredAt >= yesterdayStart) && ($0.occurredAt < todayStart) && ($0.dayPhase.rawValue == DayPhase.nightRawValue) }) private var yesterdayNightAfterLog2: [FoodLog]

But it works inside init:

1
2
3
4
5
6
7
8
9
@Query private var yesterdayNightAfterLog: [FoodLog]

init() {  
    let yesterdayStart = Calendar.current.startOfDay(for: Calendar.current.date(byAdding: .day, value: -1, to: .now)!)  
    let todayStart = Calendar.current.startOfDay(for: .now)  
    let nightRawValue = DayPhase.night.rawValue  
    
    _yesterdayNightAfterLog = Query(filter: #Predicate<FoodLog> { ($0.occurredAt >= yesterdayStart) && ($0.occurredAt < todayStart) && ($0.dayPhase.rawValue == nightRawValue) })  
}
This post is licensed under CC BY 4.0 by the author.