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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 02:06:14