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

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)
    }
    
}

解决方案

核心问题点

  1. 子类重复添加@Model注解:SwiftData中,继承自@Model类的子类无需再次标注@Model,父类的注解会自动覆盖子类,重复标注会导致底层Core Data标识符冲突。
  2. 不必要的版本标注:父类无版本限制时,子类无需额外添加@available(除非有特定需求)。
  3. 遍历继承类数组时的识别问题:需明确指定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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 11:45:10