SwiftData结构体含数组解码报错:无法将_NSInlineData转为NSArray
问题原因
这是Xcode 15/SwiftData的已知bug:当@Model类包含带有基础类型数组(如[String]、[Int])或Set的Codable结构体时,SwiftData会将结构体序列化为Data存储,但在反序列化时错误地尝试直接将存储的Data强制转换为NSArray,而非先解码回原结构体类型,从而触发类型转换错误。
解决方案
由于无法修改第三方库的Person结构体(不能添加@Model),可以手动处理结构体的序列化与反序列化,绕开SwiftData的自动处理逻辑:
修改Project类,将lead的底层存储改为Data,通过计算属性封装Person的编码和解码:
@Model final class Project { // 底层存储序列化后的Data private var _lead: Data // 对外暴露Person类型的计算属性 var lead: Person { get { // 解码:从Data转回Person,实际项目建议添加错误处理 try! JSONDecoder().decode(Person.self, from: _lead) } set { // 编码:将Person转为Data,实际项目建议添加错误处理 _lead = try! JSONEncoder().encode(newValue) } } init(lead: Person) { // 初始化时完成第一次编码 self._lead = try! JSONEncoder().encode(lead) } }
补充说明
- 示例中使用
try!是为了简化代码,实际项目里建议用do-catch包裹编码解码逻辑,避免因序列化失败导致崩溃。 - 该方案通过手动接管编码解码流程,彻底规避了SwiftData自动处理Codable结构体时的类型转换bug。
- 后续若Apple修复了该SwiftData问题,可以恢复回原来的写法。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

