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