BrewerReady | Today at 09:41
BrewerModelsBrewTimer.swiftCBrewTimer
2
import Foundation
import Observation
/// Counts down one brew and reports each step as it starts.
@Observable
final class BrewTimer {
/// The recipe being brewed.
let recipe: Recipe
/// Seconds left before the brew is done.
private(set) var remaining: TimeInterval
/// The step to do now, nil before the brew starts.
private(set) var step: Recipe.Step?
private(set) var isRunning = false
private var timer: Timer?
private var startedAt: Date?
private var pausedAt: TimeInterval = 0
init(recipe: Recipe) {
self.recipe = recipe
self.remaining = recipe.duration
}
func start() {
guard !isRunning else { return }
isRunning = true
startedAt = Date()
timer = Timer.scheduledTimer(withTimeInterval: 0.5, repeats: true) { _ in
self.tick()Capture of 'self' with non-Sendable type 'BrewTimer' in a '@Sendable' closure
}
}
func pause() {
timer?.invalidate()
pausedAt = recipe.duration - remaining
isRunning = false
}
private func tick() {
guard let startedAt else { return }
var left = max(recipe.duration - elapsed, 0)Variable 'left' was never mutated; consider changing to 'let' constant
let elapsed = pausedAt + Date().timeIntervalSince(startedAt)
var left = max(recipe.duration - elapsed, 0)
remaining = left
step = recipe.steps.last { $0.start <= elapsed }
if remaining == 0 { pause() }
}
}
Line: 13Col: 1main

Identity and Type

BrewTimer.swift
/Users/you/Developer/Brewer/Brewer/Models/BrewTimer.swift

On Demand Resource Tags

Only resources are taggable

Target Membership

Text Settings

Tab
Indent