ARTICLE AD BOX
I am currently in the middle of developing an iOS app which uses SwiftData. I want to future proof my data models by laying the ground work for data migrations down the line but I am pretty new to the whole thing and would appreciate some help.
My app currently has three SwiftData models and they are UserModelV1, EntryModelV1 and ImageModelV1.
import Foundation import SwiftData @Model class UserModelV1 { @Relationship var entries: [EntryModelV1] = [] var name: String // Various Other Properties } import Foundation import SwiftData @Model class EntryModelV1 { @Relationship var images: [ImageModelV1]? // Various Other Properties } import Foundation import SwiftData @Model class ImageModelV1 { // Various Properties }They all sit in a SchemaV1 folder alongside an AppSchemaV1 which has the following code:
import SwiftData enum AppSchemaV1: VersionedSchema { static var versionIdentifier = Schema.Version(1, 0, 0) static var models: [any PersistentModel.Type] { [ UserModelV1.self, EntryModelV1.self, ImageModelV1.self ] } }I also created a mock up for UserModelV2 simulating some random changes to the model for testing purposes and placed it in a SchemaV2 folder with an AppSchemaV2 as such:
import Foundation import SwiftData @Model class UserModelV2 { @Relationship var entries: [EntryModelV1] = [] @Attribute(originalName: "name") var firstName: String // Various Other Properties } import SwiftData enum AppSchemaV2: VersionedSchema { static var versionIdentifier = Schema.Version(2, 0, 0) static var models: [any PersistentModel.Type] { [ UserModelV2.self, EntryModelV1.self, ImageModelV1.self ] } }I then created an AppMigration plan as such:
import SwiftData enum AppMigrationPlan: SchemaMigrationPlan { static var schemas: [any VersionedSchema.Type] { [ AppSchemaV1.self, AppSchemaV2.self ] } static var stages: [MigrationStage] { [ .lightweight( fromVersion: AppSchemaV1.self, toVersion: AppSchemaV2.self ) ] } }And finally a custom ModelContainerProvider as such:
import SwiftData struct ModelContainerProvider { static let shared: ModelContainer = { do { return try ModelContainer( for: AppSchemaV1.self, // Error on this line migrationPlan: AppMigrationPlan.self ) } catch { fatalError("Migration failed: \(error)") } }() }Finally I call the modelContainer in my app as such:
import SwiftData import SwiftUI @main struct MyApp: App { var body: some Scene { WindowGroup { ContentView() } .modelContainer(ModelContainerProvider.shared) } }The issue I'm getting is inside the ModelContainer Provider file above. I've highlighted the line that gives me the error and the exact error message is below:
Cannot convert value of type 'AppSchemaV1.Type' to expected argument type 'Schema'
I'm not entirely sure how to fix this issue and am also wondering if I am going along the right lines in regards to setting up my data migrations or if I'm way off.
I'd appreciate any help. Thanks in advance.
