SwiftData中CounterModel不遵循PersistentModel协议问题排查
SwiftData模型关联后PersistentModel兼容问题排查记录
问题背景
开发一款基于SwiftData的运动得分记录Demo App,初始版本中CounterModel(SwiftData模型类)仅包含id和pro属性,可正常工作。但为其添加teams: [Team]属性后,出现编译报错。
初始报错与尝试解决
添加teams属性后,出现以下三个编译错误:
Type 'CounterModel' does not conform to protocol 'PersistentModel'No exact matches in call to instance method 'getValue'No exact matches in call to instance method 'setValue'
尝试过以下方案均无效:
- 让
CounterModel和Team结构体同时遵循Identifiable、Hashable协议 - 为两者添加
Codable协议 - 将
Team结构体嵌套进CounterModel类内部
按SwiftData规范调整后的问题
根据SwiftData关联模型的要求,对代码做了如下调整:
- 将
Team从结构体改为带@Model标识的持久化类 - 为
CounterModel的teams属性添加@Relationship(.cascade)修饰,定义级联关联关系 - 给
Team的editing属性标记@Transient,排除该属性的持久化
调整后的代码:
import Foundation import SwiftData @Model class CounterModel: Identifiable, Hashable { @Attribute(.unique) var id = UUID() @Relationship(.cascade) var teams: [Team] var pro: Bool init(teams: [Team], pro: Bool) { self.teams = teams self.pro = pro } func toTeamArr() -> [Team] { return teams } } @Model class Team: Identifiable, Hashable { @Attribute(.unique) var id: UUID = UUID() var name: String var score: Int @Transient var editing: Bool = false init(name: String, score: Int, editing: Bool = false) { self.name = name self.score = score self.editing = editing } }
但此时仍存在两个编译错误:
Type 'CounterModel' does not conform to protocol 'PersistentModel'Type 'Team' does not conform to protocol 'PersistentModel'
最终定位与反馈
将上述模型代码单独提取到全新Xcode项目中,可正常编译,说明模型定义本身无问题。进一步排查发现,问题根源在于将通过@Query获取的CounterModel实例作为参数传递给子视图——移除视图参数中的CounterModel类型后,项目编译恢复正常。
目前推测这是Xcode/SwiftData的Bug,已提交官方反馈(FB12338703)。
内容的提问来源于stack exchange,提问作者PaytonDEV
相关产品推荐
相关产品推荐

