为SwiftData Model新增Bool属性导致应用崩溃求助
解决方案
1. 删除自动生成的自定义Getter代码
你看到的这段自动生成代码是崩溃的直接诱因:
{ get { _drill.wrappedValue } }
@Query作为SwiftData的属性包装器,已经内置了属性值的处理逻辑,手动添加自定义getter会干扰其内部工作流程,直接删除这段代码即可。
修改后的Query代码应恢复为:
@Environment(\.modelContext) var context @Query(sort: [SortDescriptor(\Note.isCompleted), SortDescriptor(\Note.title)]) var drill: [Note]
2. 为新增的isWorking属性添加默认值
SwiftData要求所有模型属性必须有明确的初始化方式,Bool类型如果没有默认值,会导致查询时无法正确初始化模型实例,引发崩溃。给isWorking添加默认值:
@Model class Note { var id: UUID @Attribute(.unique) var title: String var drillDescrip: String var gamePractice: String var selfnotes: String var isCompleted: Bool var isWorking: Bool = false // 添加默认值 }
也可以在模型的初始化器中为isWorking赋值,确保每个实例创建时该属性都有明确值。
3. 确认Schema迁移配置(可选)
如果上述步骤仍未解决问题,检查ModelContainer的初始化代码,确保指定了正确的schema版本和迁移策略。例如:
let container = try ModelContainer( for: Note.self, configurations: ModelConfiguration( schemaVersion: 3, migrationPlan: NoteMigrationPlan.self // 确保迁移计划包含SchemaV3的定义 ) )
如果是直接使用新Schema(删除应用后),可以暂时移除迁移配置,让SwiftData直接创建新的数据库:
let container = try ModelContainer( for: Note.self, configurations: ModelConfiguration(isStoredInMemoryOnly: false) )
4. 彻底清理应用数据
- 删除模拟器中的应用
- 清理Xcode的Derived Data:
Xcode > 设置 > 位置 > Derived Data > 点击箭头打开文件夹后删除对应项目的文件夹 - 重新编译运行应用
内容的提问来源于stack exchange,提问作者MAdelman
相关产品推荐
相关产品推荐

