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() { ... }
}
}