You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何筛选包含指定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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 11:42:26