Jan 18, 2024
public struct AppDataSchema {
    enum MigrationPlan: SchemaMigrationPlan {
        static var schemas: [VersionedSchema.Type] {
            [AppDataSchema.V1.self]
        }
        static var stages: [MigrationStage] {
            []
        }
    }
    public enum V1: VersionedSchema {
        public static var versionIdentifier: Schema.Version = .init(1, 0, 0)
        public static var models: [any PersistentModel.Type] {[
            // your models: AppDataSchema.V1.[MODEL NAME].self
        ]}
    }
}public typealias Workout = AppDataSchema.V1.Workout
extension AppDataSchema.V1 {
    @Model
    final public class Workout {
        ...
    }
}extension Workout {
    @Transient
    public var success: Bool { ... }
    public func completeWorkout() { ... }
}extension Workout {
    public class Builder {
        private var context: ModelContext?
        @discardableResult
        public func with(context: ModelContext) -> Workout.Builder {
            self.context = context
            return self
        }
        ...
    }
}
// usage
let workout = Workout.Builder()
                .with(context: modelContext)
                .begin()
                .build(from: program)public extension Workout {
    struct Query {
        public static let mostRecent: FetchDescriptor<Workout> = {
            var descriptor = FetchDescriptor<Workout>(...)
            ...
            return descriptor
        }()
    }
}
// Usage in SwiftUI
@Query(Workout.Query.mostRecent) var mostRecent: [Workout]extension Workout {
    @Transient
    public var readOnly: Workout.ReadOnly {
        return Workout.ReadOnly(...)
    }
    public struct ReadOnly: Codable, Equatable, Hashable {
        init() { ... }
    }
}