iOS 26.0+SwiftData继承开发报错:视图渲染失败
SwiftData继承关系引发的致命错误解决
问题描述
尝试使用SwiftData构建带有继承关系的应用时,触发如下致命错误,数据保存操作看似正常但视图无法渲染:
Thread 1: 致命错误:绝不能访问完整的未来备份数据 - PersistentIdentifier(id: SwiftData.PersistentIdentifier.ID(backing: SwiftData.PersistentIdentifier.PersistentIdentifierBacking.managedObjectID(0x9e8d430d54ffc2b5 x-coredata://929792D1-6897-4420-A541-1E8A0D826030/Car/p1))) with Optional(28740A90-BA41-432D-AE2E-A582F1E00296)
错误截图:
原代码如下:
import SwiftUI import SwiftData @main struct SwiftDataInheritanceApp: App { var body: some Scene { WindowGroup { ContentView() } .modelContainer(for: [Garage.self, Vehicle.self, Car.self, Bike.self]) } } struct ContentView: View { @Query var garages: [Garage] @Environment(\.modelContext) var context var body: some View { List{ Button("Add Garage") { let garage = Garage(name: "Garage") let car = Car(name: "Car") let bike = Bike(name: "Bike") garage.vehicles.append(contentsOf: [car, bike]) context.insert(garage) try! context.save() } ForEach(garages) { garage in Text(garage.name) ForEach(garage.vehicles) {vehicle in Text(vehicle.name) } } } } } @Model class Garage { @Relationship(deleteRule: .cascade ,inverse: \Vehicle.garage) var vehicles: [Vehicle] var name: String init(name: String) { self.name = name self.vehicles = [] } } @Model class Vehicle { var garage: Garage? var name: String init(name: String) { self.name = name } } @available(iOS 26.0, *) @Model class Car: Vehicle { override init(name: String) { super.init(name: name) } } @available(iOS 26.0, *) @Model class Bike: Vehicle { override init(name: String) { super.init(name: name) } }
解决方案
核心问题点
- 子类重复添加
@Model注解:SwiftData中,继承自@Model类的子类无需再次标注@Model,父类的注解会自动覆盖子类,重复标注会导致底层Core Data标识符冲突。 - 不必要的版本标注:父类无版本限制时,子类无需额外添加
@available(除非有特定需求)。 - 遍历继承类数组时的识别问题:需明确指定
id字段确保ForEach正确识别元素。
修改后的代码
import SwiftUI import SwiftData @main struct SwiftDataInheritanceApp: App { var body: some Scene { WindowGroup { ContentView() } // 仅需注册父类和关联类,子类会被自动包含 .modelContainer(for: [Garage.self, Vehicle.self]) } } struct ContentView: View { @Query var garages: [Garage] @Environment(\.modelContext) var context var body: some View { List{ Button("Add Garage") { let garage = Garage(name: "Garage") let car = Car(name: "Car") let bike = Bike(name: "Bike") garage.vehicles.append(contentsOf: [car, bike]) context.insert(garage) try! context.save() } ForEach(garages) { garage in Text(garage.name) // 明确指定persistentModelID作为唯一标识,解决遍历识别问题 ForEach(garage.vehicles, id: \.persistentModelID) { vehicle in Text(vehicle.name) } } } } } @Model class Garage { @Relationship(deleteRule: .cascade, inverse: \Vehicle.garage) var vehicles: [Vehicle] var name: String init(name: String) { self.name = name self.vehicles = [] } } @Model class Vehicle { var garage: Garage? var name: String init(name: String) { self.name = name } } // 子类移除@Model注解和不必要的版本标注 class Car: Vehicle { override init(name: String) { super.init(name: name) } } class Bike: Vehicle { override init(name: String) { super.init(name: name) } }
内容的提问来源于stack exchange,提问作者hilaprodomo
相关产品推荐
相关产品推荐

