如何筛选包含指定int值Weekday的Routine实体?
Core Data 筛选Routine实体的NSPredicate解决方案
给定条件
- Routine(实体)
- 关系:
weekdays,目标实体:Weekday,反向关系:routine
- 关系:
- Weekday(实体)
- 属性:
int(64位整数) - 关系:
routine,目标实体:Routine,反向关系:weekdays
- 属性:
筛选目标
筛选所有满足以下条件的Routine实体:其weekdays关联关系中包含一个int属性等于指定64位整数的Weekday实体。
我的尝试
// 常量 let weekDay = 1 // 尝试1 let attemptedNSPredicate = NSPredicate(format: "ANY weekdays.int == %@", weekDay) // 尝试2 let attemptedNSPredicate = NSPredicate(format: "SUBQUERY(weekdays, weekday, weekday.int == %@", weekday) // 尝试3 let attemptedNSPredicate = NSPredicate(format: "ANY %K.int == %@", \Routine.weekdays, weekday)
解决方案
可行的NSPredicate实现
方式一:修正ANY语法的类型问题
由于%@用于匹配对象类型,需将64位整数包装为NSNumber避免类型不匹配:
let targetWeekday = 1 // 指定的64位整数 let predicate = NSPredicate(format: "ANY weekdays.int == %@", NSNumber(value: targetWeekday))
方式二:补全SUBQUERY语法
SUBQUERY需要完整的闭合结构,并通过判断结果集合数量确认存在匹配项:
let targetWeekday = 1 let predicate = NSPredicate(format: "SUBQUERY(weekdays, $weekday, $weekday.int == %@).@count > 0", NSNumber(value: targetWeekday))
整合到FetchRequest
func yourSolution(_ solution: NSPredicate) -> FetchRequest<Routine> { FetchRequest<Routine>( entity: Routine.entity(), sortDescriptors: [], predicate: solution ) } // 使用示例 let targetWeekday = 1 let predicate = NSPredicate(format: "ANY weekdays.int == %@", NSNumber(value: targetWeekday)) let fetchRequest = yourSolution(predicate)
错误分析
- 尝试1:直接传入Int值给
%@会触发类型不匹配,需将Int转为NSNumber。 - 尝试2:SUBQUERY语法不完整,缺少闭合括号和结果数量判断。
- 尝试3:
%K需要传入字符串形式的键路径,不能直接使用KeyPath类型的\Routine.weekdays。
内容的提问来源于stack exchange,提问作者escaping closure
相关产品推荐
相关产品推荐

