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时抛出编码错误。 - 解决步骤:
- 直接移除
SingleFolder中的frame: CGRect属性,或者将其拆分为SwiftData支持的基础数值类型(比如frameX、frameY、frameWidth、frameHeight四个Double类型属性)。 - 若需保留
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 } } - 修改后重新初始化
ModelContainer,编码错误即可消除。
- 直接移除
内容的提问来源于stack exchange,提问作者ikunhub
相关产品推荐
相关产品推荐

