SwiftData使用嵌套枚举触发致命错误:Unexpected type for CompositeAttribute
SwiftData嵌套枚举模型定义的致命错误解决与原因分析
错误信息
SwiftData/SchemaProperty.swift:373: Fatal error: Unexpected type for CompositeAttribute: Builtin.BridgeObject
复现代码
模型与视图代码
import SwiftUI import SwiftData enum MyEnum: Identifiable, Codable { var id: String { UUID().uuidString } case aCase } enum MyOtherEnum: Identifiable, Codable { var id: String { UUID().uuidString } case aCase(Set<MyEnum>) } @Model final class MyModel: Identifiable { init(id: String? = nil, something: MyOtherEnum? = nil) { self.id = id self.something = something } @Attribute(.unique) private(set) var id: String? private(set) var something: MyOtherEnum? } struct ContentView: View { var body: some View { Text("Content View") } }
App入口代码
import SwiftUI import SwiftData @main struct MyApp: App { var body: some Scene { WindowGroup { ContentView() .modelContainer(for: [ MyModel.self ]) } } }
问题猜测与替代方案
最初猜测SwiftData无法处理Set<MyEnum>这类嵌套结构,改用结构体实现后问题解决:
struct MyOtherEnum: Identifiable, Codable { let id: String let nestedEnum: Set<MyEnum> init(id: String? = nil, nestedEnum: Set<MyEnum>) { self.id = id ?? UUID().uuidString self.nestedEnum = nestedEnum } }
原因解析
SwiftData对枚举的支持存在明确局限性:
- 仅兼容关联值为基础类型、单个Codable对象的枚举;
- 当枚举关联值为**集合类型(如Set、Array)**时,SwiftData在生成数据模型Schema的过程中,无法正确解析这种复杂嵌套类型,导致内部类型匹配逻辑崩溃,抛出
Builtin.BridgeObject相关致命错误。 - 改用结构体后,SwiftData可将整个结构体作为完整Codable类型序列化为单一属性存储,因此能正常工作。
内容的提问来源于stack exchange,提问作者Whirlwind
相关产品推荐
相关产品推荐

