Swift计时器返回前一个if语句,但未满足条件

Swift计时器返回前一个if语句,但未满足条件,swift,timer,Swift,Timer,我有一个这样的锻炼计时器。锻炼30秒->休息10秒。我有一个if语句来打印一些文本,但由于某种原因,它们都会同时被快速调用,而不仅仅是符合if标准的语句。知道为什么吗?我曾尝试在每个案例的底部添加return,但在第一次开火后都没有调用 var restBreaks: [Double] = [30, 60] var startTime = Date.timeIntervalSinceReferenceDate Timer.scheduledTimer(withTimeI

我有一个这样的锻炼计时器。锻炼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
        }
    }

您的代码逻辑不是您想要实现的。试着这样做:

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
                }
            }
            
        }
    }
}
struct ContentView:View{
@国家专用var秒数:双精度=0.0
@国家私有var restDuration:Double=4.0
var body:一些观点{
文本(“训练计时器”)。出现{
var breakIndex=0
//格式必须为x,且至少为x+restDuration
让restBreaks:[Double]=[5.0,15.0]
var startTime=Date.timeintervalnceReferenceDate
Timer.scheduledTimer(withTimeInterval:1,repeats:true){Timer in
让时间=Date.TimeIntervalenceReferenceDate-startTime
self.seconds=时间
如果breakIndex=restBreaks[breakIndex]&&time=restBreaks[breakIndex]+restDuration{
breakIndex=breakIndex+1
}
//重新启动计时器
如果时间>=20{
startTime=Date.TimeIntervalenceReferenceDate
breakIndex=0
}
}
}
}
}

显示“restBreaks”的代码和其中的数据,以便我们可以复制问题。您的意思是:“for restLocation in self.restBreaks{…}”?@workingdog我已经更新了我的代码以显示更多内容。:@workingdog你会注意到,即使在休息时也会调用锻炼。即使使用return语句。这是因为60,假设时间是35,那么30的条件为真,而30的条件为假60@JoakimDanielson好的,这一行给了我问题?
如果时间>=restLocation&&time此代码有一些严重的问题,因为它似乎创建了无限多的计时器对象。添加一个
print(timer)
作为闭包中的第一行,您将看到它每次都有一个新的内存地址,因此有一个新的计时器对象。@用户在修复此代码之前不会实现它。我已经放置了一个print(timer)作为闭包中的第一行,我只得到了一个计时器,这是应该的。我没有得到无限多的计时器。@JoakimDanielson可能因为正在使用的代码而创建了一个新的计时器对象。onAppear?当我得到这个行为时,我在操场上尝试过,我也可以在普通项目中尝试。请注意“.onAppear{…}”中的代码这只是一个可能方法的示例。将代码打包到有用的函数/类中,计时器的开始/结束取决于应用程序。
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
                }
            }
            
        }
    }
}