Complete native rewrite of the web-based SoliCards game as a SwiftUI multiplatform app targeting iOS 17+, iPadOS 17+, and macOS 14+. Three solitaire variants (Klondike, Spider, FreeCell) with full game rules, drag & drop, smart zoom layout, 6 themes, 4 difficulty levels, SwiftData persistence, VoiceOver accessibility, and 57 unit tests. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
40 lines
890 B
Swift
40 lines
890 B
Swift
import Foundation
|
|
import Observation
|
|
|
|
@MainActor
|
|
@Observable
|
|
final class TimerService {
|
|
var elapsedSeconds: Int = 0
|
|
private var task: Task<Void, Never>?
|
|
private var isRunning = false
|
|
|
|
func start() {
|
|
guard !isRunning else { return }
|
|
isRunning = true
|
|
task = Task { [weak self] in
|
|
while !Task.isCancelled {
|
|
try? await Task.sleep(for: .seconds(1))
|
|
guard let self, self.isRunning else { break }
|
|
self.elapsedSeconds += 1
|
|
}
|
|
}
|
|
}
|
|
|
|
func stop() {
|
|
isRunning = false
|
|
task?.cancel()
|
|
task = nil
|
|
}
|
|
|
|
func reset() {
|
|
stop()
|
|
elapsedSeconds = 0
|
|
}
|
|
|
|
var formattedTime: String {
|
|
let minutes = elapsedSeconds / 60
|
|
let seconds = elapsedSeconds % 60
|
|
return String(format: "%d:%02d", minutes, seconds)
|
|
}
|
|
}
|