Swift 计时器返回上一个没有满足条件的 if 语句

Swift timer returning previous if statement without criteria being met

我有一个这样的锻炼计时器。 30 秒锻炼 -> 10 秒休息。我有一个 if 语句来打印一些文本,但由于某种原因,它们同时被快速调用,而不仅仅是符合 If 标准的那个。知道为什么吗?我试过在每个案例的底部添加 return 但在第一次触发后都没有被调用。

var restBreaks: [Double] = [30, 60]
    
    var startTime = Date.timeIntervalSinceReferenceDate
    Timer.scheduledTimer(withTimeInterval: 0.01, repeats: true) { [self] timer in
        
        let time = Date.timeIntervalSinceReferenceDate - startTime
        
        self.seconds = time
        
        print(time)
        
        for restLocation in restBreaks {
            if time >= restLocation && time <= restLocation + 10 {
                print("RESTING")
            } else {
                print("WORKOUT")
            }
        }
        
        // Restarting timer
        if time >= 90 {
            startTime = Date.timeIntervalSinceReferenceDate
        }
    }

结果:(休息时间)正如您所见,它正在打印“WORKOUT!”

RESTING
WORKOUT!
RESTING
RESTING
RESTING
WORKOUT!
RESTING
RESTING
RESTING
WORKOUT!
RESTING

你的代码逻辑不是你想要实现的。尝试这样的事情:

struct ContentView: View {
    @State private var seconds: Double = 0.0
    @State private var restDuration: Double = 4.0
    
    var body: some View {
        Text("workout timers").onAppear {
            var breakIndex = 0
            // must be of the form x, and at least x+restDuration
            let restBreaks: [Double] = [5.0, 15.0]
            
            var startTime = Date.timeIntervalSinceReferenceDate
            Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { timer in
                let time = Date.timeIntervalSinceReferenceDate - startTime
                self.seconds = time

                if breakIndex < restBreaks.count {
                    if time >= restBreaks[breakIndex] && time <= restBreaks[breakIndex] + restDuration {
                        print("---> RESTING time: \(time) breakIndex: \(breakIndex) rest at: \(restBreaks[breakIndex]) to: \(restBreaks[breakIndex] + restDuration)")
                    } else {
                        print("WORKOUT time: \(time)")
                    }
                }
                
                if breakIndex+1 < restBreaks.count && time >= restBreaks[breakIndex] + restDuration {
                    breakIndex = breakIndex + 1
                }
 
                // Restarting timer
                if time >= 20 {
                    startTime = Date.timeIntervalSinceReferenceDate
                    breakIndex = 0
                }
            }
            
        }
    }
}