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

SwiftData报错:Composite Coder仅支持Keyed Container,ModelContainer初始化失败

问题

实例化ModelContainer对象时触发错误:Thread 1: Fatal error: Composite Coder only supports Keyed Container。自定义模型SingleFolder,想要生成可全局访问的ModelContainer单例,使用Xcode 15.0 beta4、iOS 17.0模拟器,相关代码如下:

DatabaseService 代码

class DatabaseService {
    static var shared = DatabaseService()
    
    var container: ModelContainer?
    var context: ModelContext?
    
    init() {
        do {
            container = try ModelContainer(for: [SingleFolder.self])
            if let container {
                context = ModelContext(container)
            }
        } catch {
            print(error)
        }
    }
}

SingleFolder 模型代码

@Model class SingleFolder {
    let creationTime: Date
    var editTime: Date
    var folderName: String
    
    var frame: CGRect = CGRect.zero

    init(creationTime: Date, editTime: Date, folderName: String) {
        self.creationTime = creationTime
        self.editTime = editTime
        self.folderName = folderName
    }
}
问题原因与解决办法
  • 核心问题:SwiftData在iOS 17/Xcode 15 beta阶段暂不原生支持CGRect这类复杂值类型,其内置编码器无法处理非基础类型的编码逻辑,导致初始化ModelContainer时抛出编码错误。
  • 解决步骤:
    1. 直接移除SingleFolder中的frame: CGRect属性,或者将其拆分为SwiftData支持的基础数值类型(比如frameX、frameY、frameWidth、frameHeight四个Double类型属性)。
    2. 若需保留CGRect的使用体验,可通过计算属性封装基础值的转换,示例代码:
      @Model class SingleFolder {
          let creationTime: Date
          var editTime: Date
          var folderName: String
          
          // 用SwiftData支持的基础类型存储CGRect参数
          var frameX: Double = 0.0
          var frameY: Double = 0.0
          var frameWidth: Double = 0.0
          var frameHeight: Double = 0.0
          
          // 对外暴露CGRect类型的计算属性
          var frame: CGRect {
              get {
                  CGRect(x: frameX, y: frameY, width: frameWidth, height: frameHeight)
              }
              set {
                  frameX = newValue.origin.x
                  frameY = newValue.origin.y
                  frameWidth = newValue.size.width
                  frameHeight = newValue.size.height
              }
          }
      
          init(creationTime: Date, editTime: Date, folderName: String) {
              self.creationTime = creationTime
              self.editTime = editTime
              self.folderName = folderName
          }
      }
      
    3. 修改后重新初始化ModelContainer,编码错误即可消除。

内容的提问来源于stack exchange,提问作者ikunhub

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 19:57:16