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

SwiftData Predicate中Set.contains检查触发崩溃问题求助

问题分析与解决方案

崩溃原因大概率是Core Data的#Predicate闭包在解析Set<String>.contains(_:)时存在底层实现兼容问题,或是你的FactModel中categories属性的持久化配置不正确。

核心排查点

  • 检查FactModel的categories属性定义:iOS 17+/macOS 14+之前的版本,Core Data原生不支持Set<String>作为持久化属性,需将其声明为@Attribute(.transformable)并指定合适转换器;iOS 17+虽支持原生集合类型,但#Predicate对Set的contains方法解析可能存在bug,导致底层空指针访问(对应报错EXC_BAD_ACCESS (code=1, address=0x0))。
  • 对比text.contains("a")的正常情况:String.contains是#Predicate完全支持的方法,能被Core Data正确解析执行。

修复方案

方案1:改用NSPredicate语法替代#Predicate

针对Set类型的包含检查,Core Data原生谓词语法更可靠:

if key != "general" {
    fetchDescriptor.predicate = NSPredicate(format: "ANY categories == %@", key)
}

这种写法是Core Data长期支持的集合包含检查方式,不会出现解析异常。

方案2:修正categories属性的持久化配置

  • 若部署目标为iOS 17+/macOS 14+:确认categories在数据模型中设置为Set<String>类型(Xcode数据模型编辑器中,将属性类型设为String并勾选Is Collection)。
  • 若为更低版本:将属性声明为Transformable并实现对应转换器,或改用[String]数组类型替代Set<String>,再用#Predicate的contains方法检查。

内容的提问来源于stack exchange,提问作者Ihor M.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 16:57:20