NSPredicate 筛选器小于 OR nil

NSPredicate filter for less than OR nil

提问人:Codebrah 提问时间:7/12/2022 最后编辑:Codebrah 更新时间:7/12/2022 访问量:189

问:

我希望 NSPredicate 为我返回 keyPath 的结果,该结果要么是 nil...或小于给定日期。我正在使用 NSPredicate 获取核心数据。

这些工作正常...

let endDatePredicate = NSPredicate(format: "%K > %@", #keyPath(RepeatingTask.endDate), date as NSDate)
let endDatePredicate = NSPredicate(format: "%K == nil", #keyPath(RepeatingTask.endDate), date as NSDate)

但是我无法让它们与 OR 运算符一起正常工作......

let endDatePredicate = NSPredicate(format: "%K > %@ || %K == nil", #keyPath(RepeatingTask.endDate), date as NSDate)
let endDatePredicate = NSPredicate(format: "%K > %@ OR %K == nil", #keyPath(RepeatingTask.endDate), date as NSDate)
let endDatePredicate = NSPredicate(format: "(%K > %@) || (%K == nil)", #keyPath(RepeatingTask.endDate), date as NSDate)
Swift Objective-C Core-Data nspredicate

评论

3赞 Martin R 7/12/2022
谓词格式字符串中有两个说明符,因此还必须传递两个键路径作为参数:%KNSPredicate(format: "%K > %@ OR %K == nil", #keyPath(RepeatingTask.endDate), date as NSDate, #keyPath(RepeatingTask.endDate))

答:

2赞 LoVo 7/12/2022 #1

可以使用 NSCompoundPredicate。例如:

let first = NSPredicate(format: "%K > %@", #keyPath(RepeatingTask.endDate), date as NSDate)
let second = NSPredicate(format: "%K == nil", #keyPath(RepeatingTask.endDate), date as NSDate)
let predicate = NSCompoundPredicate(orPredicateWithSubpredicates: [first, second])