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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 18:05:07