SwiftData не может сохранить свойство Timer класса?IOS

Программируем под IOS
Ответить
Anonymous
 SwiftData не может сохранить свойство Timer класса?

Сообщение Anonymous »

введите здесь описание изображения
В Xcode 15.0.1 я пытаюсь использовать SwiftData для создания StopwatchItem в моем приложении секундомера, в котором есть таймер код> свойство. Я получаю ошибки:
  • Метод экземпляра setValue(forKey:to:) требует, чтобы «Таймер» соответствовал «PersistentModel»
  • Метод экземпляра getValue(forKey:) требует, чтобы Timer соответствовал PersistentModel
Я знаю, что это означает что-то вроде «Невозможно сохранить таймер в SwiftData», но я не уверен, как решить эту проблему. м лицом.
Мое приложение секундомера будет иметь возможность создавать и контролировать несколько секундомеров, включая глобальное управление (запустить все, остановить все, сбросить все и т. д.) и возможность сохранять секундомер. наборы, к которым можно обратиться позже.
Решения, которые я попробовал
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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»