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.
相关产品推荐
相关产品推荐

