SwiftData枚举属性排序报错:keypath未找到的问题求助
SwiftData枚举属性排序/过滤崩溃问题解决办法
这是SwiftData当前的已知限制,并非操作错误。哪怕你的枚举实现了String/Codable协议、数据库中已以字符串形式存储枚举值,SwiftData目前也不支持直接通过枚举类型的键路径执行排序、过滤等查询操作——这就是用@Query(sort: \Book.status)时出现keypath status not found in entity Book报错的原因。另外,计算属性不会被SwiftData持久化到数据库,自然也无法通过它的键路径做查询操作。
可行的解决办法是给模型添加一个与枚举对应的原始值存储属性,让枚举的读写逻辑关联到这个属性:
enum Status: String, Codable, CaseIterable { case available, borrowed, lost } @Model class Book { // 用于SwiftData持久化的原始值属性 var statusRawValue: String // 业务逻辑中使用的枚举属性 var status: Status { get { Status(rawValue: statusRawValue) ?? .available } set { statusRawValue = newValue.rawValue } } init(status: Status) { self.statusRawValue = status.rawValue } }
之后查询时直接使用原始值属性的键路径:
- 排序示例:
@Query(sort: \Book.statusRawValue) var books: [Book] - 过滤示例(使用Predicate):
let targetStatus = Status.borrowed.rawValue let predicate = #Predicate<Book> { $0.statusRawValue == targetStatus } @Query(filter: predicate) var borrowedBooks: [Book]
这种方式通过将枚举值映射为SwiftData可识别的基础类型属性,绕开了枚举键路径不支持的限制,同时保持业务逻辑中使用枚举的便利性。
内容的提问来源于stack exchange,提问作者Stewart Lynch
相关产品推荐
相关产品推荐

