В Xcode 15.0.1 я пытаюсь использовать SwiftData для создания StopwatchItem в моем приложении секундомера, в котором есть таймер код> свойство. Я получаю ошибки:
- Метод экземпляра setValue(forKey:to:) требует, чтобы «Таймер» соответствовал «PersistentModel»
- Метод экземпляра getValue(forKey:) требует, чтобы Timer соответствовал PersistentModel
Мое приложение секундомера будет иметь возможность создавать и контролировать несколько секундомеров, включая глобальное управление (запустить все, остановить все, сбросить все и т. д.) и возможность сохранять секундомер. наборы, к которым можно обратиться позже.
Решения, которые я попробовал
1. Предлагаемое решение ChatGPT 4o: определите отдельный StopwatchController, который имеет функции start(), stop(), reset() и содержит свойство таймера.
Почему это не идеально: я обнаружил, что не могу таким образом глобально управлять секундомерами
2. Определение функций управления секундомером в StopwatchItemView, который отображается в ContentView в виде
forEach(stopwatches) { stopwatch in
StopwatchItemView(stopwatch: stopwatch)
}
Почему это не идеально: невозможно глобально управлять секундомерами, труднее сохранять состояние/прогресс таймера при выходе из приложения.
Код
Примечание. Включение ContentView нецелесообразно, поскольку оно по-прежнему содержит шаблонный код.
StopwatchController.swift
import Foundation
import SwiftData
import Combine
@Model
class StopwatchSet: Identifiable, ObservableObject {
var id = UUID()
var label: String
var stopwatches: [StopwatchItem]
init(id: UUID = UUID(), label: String, stopwatches: [StopwatchItem]) {
self.id = id
self.label = label
self.stopwatches = stopwatches
}
}
@Model
class StopwatchItem: Identifiable, ObservableObject {
var id = UUID()
var isRunning: Bool = false
var label: String
var timeElapsed: Double = 0.0
var laps: [Lap] = []
private var timer: Timer?
init(id: UUID = UUID(), label: String, timeElapsed: Double) {
self.id = id
self.label = label
self.timeElapsed = timeElapsed
}
func start() {
isRunning = true
timer = Timer.scheduledTimer(withTimeInterval: 0.01, repeats: true) { [weak self] _ in
self?.timeElapsed += 0.01
}
}
func stop() {
isRunning = false
timer?.invalidate()
timer = nil
}
func reset() {
stop()
timeElapsed = 0.0
}
}
@Model
class Lap: Identifiable, ObservableObject {
var id = UUID()
var label: String
var timeElapsed: String
init(label: String, timeElapsed: String) {
self.label = label
self.timeElapsed = timeElapsed
}
}
StopwatchItemView.swiftimport SwiftUI
import SwiftData
struct StopwatchItemView: View {
@State var stopwatch: StopwatchItem
var body: some View {
VStack {
Text(formatTime(stopwatch: stopwatch, input: stopwatch.timeElapsed))
}
}
}
#Preview {
StopwatchItemView(stopwatch: StopwatchItem(label: "Stopwatch", timeElapsed: 0.0))
}
Подробнее здесь: https://stackoverflow.com/questions/785 ... of-a-class
Мобильная версия