是否可以使用#Predicate,其表达式的一部分调用函数(尝试将该谓词传递到
SwiftData Query
):
func myPredicate(year: Int, month: Int) -> Predicate<MyObj> {
#Predicate<MyObj> { obj in
let components = Calendar.current.dateComponents([.year, .month], from: obj.date))
return components.year == year && components.month == month
}
}
在这种情况下,我收到一个错误:
Predicate body may only contain one expression
。我尝试将其移动到另一个静态函数,如下所示:
extension MyObj {
static func checkDate(date: Date, year: Int, month: Month) {
let components = Calendar.current.dateComponents([.year, .month], from: obj.date))
return components.year == year && components.month == month
}
}
但现在我得到了
The checkDate function is not supported in this predicate
除了将日期存储为单独的年份和月份字段之外,还有其他方法吗?
谢谢
您不能从谓词调用函数,文档
中有您可以使用哪些操作的列表您可以根据给定参数计算日期间隔,然后在谓词中使用这些日期值
static func predicate(year: Int, month: Int) -> Predicate<MyObj> {
let minDate = Calendar.current.date(from: DateComponents(year: year, month: month))!
let maxDate = Calendar.current.date(byAdding: .month, value: 1, to: minDate)!
return #Predicate<MyObj> { object in
object.date >= minDate && object.date < maxDate
}
}