我在Swift中使用了一个简单的游戏,它使用Timer对象来跟踪用户活了多久。我希望能够追踪他们的最佳时间。我目前正在配置这样的计时器:
func startGameTimer() {
timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: (#selector(updateTimer)), userInfo: nil, repeats: true)
}
func updateTimer() {
seconds += 1
activeTimer.text = timeString(time: TimeInterval(seconds))
}
func timeString(time:TimeInterval) -> String {
let minutes = Int(time) / 3600
let seconds = Int(time) / 60 % 60
let milliseconds = Int(time) % 60
return String(format:"%02i:%02i.%02i", minutes, seconds, milliseconds)
}
当玩家输掉时,他们的时间将以格式显示为字符串:" mm:ss.ms"
我想将UserDefaults中的存储值与当前的Timer值进行比较,以确定哪个是最佳时间。
我见过几个关于Date对象的问题,但这显然不是一天中的时间,也不会使用小时。
在不解析和比较时间的每个部分的情况下比较这些值的最佳方法是什么?
答案 0 :(得分:0)
启动计时器时可以使用var start = Date.timeIntervalSinceReferenceDate,然后使用var stop = Date.timeIntervalSinceReferenceDate,然后测量时间并将其与userDefaults中的时间进行比较。
答案 1 :(得分:0)
这是我解析和比较计时器值的方法。同样,值以#34; mm:ss.ms"
的格式存储为字符串此函数会将UserDefaults中的Best Time变量设置为最高计时器值。
func determineBestTime() {
if UserDefaults.standard.value(forKey: "bestTime") == nil {
UserDefaults.standard.set(currentTime, forKey: "bestTime")
bestTimeLabel.text = activeTimerLabel.text
bestTime = UserDefaults.standard.value(forKey: "bestTime") as! String
} else {
let bestTimeValues = bestTime.components(separatedBy: ":")
let currTimeValues = currentTime.components(separatedBy: ":")
let bestTimeMin = Int(bestTimeValues[0])!
let currTimeMin = Int(currTimeValues[0])!
if currTimeMin < bestTimeMin {
return
} else if currTimeMin > bestTimeMin {
UserDefaults.standard.set(currentTime, forKey: "bestTime")
bestTime = UserDefaults.standard.value(forKey: "bestTime") as! String
bestTimeLabel.text = bestTime
return
}
let bestTimeVals = bestTimeValues[1].components(separatedBy: ".")
let currTimeVals = currTimeValues[1].components(separatedBy: ".")
let bestTimeSec = Int(bestTimeVals[0])!
let currTimeSec = Int(currTimeVals[0])!
if currTimeSec < bestTimeSec {
return
} else if currTimeSec > bestTimeSec {
UserDefaults.standard.set(currentTime, forKey: "bestTime")
bestTime = UserDefaults.standard.value(forKey: "bestTime") as! String
bestTimeLabel.text = bestTime
return
}
let bestTimeMilliSec = Int(bestTimeVals[1])!
let currTimeMilliSec = Int(currTimeVals[1])!
if currTimeMilliSec < bestTimeMilliSec {
return
} else if currTimeMilliSec > bestTimeMilliSec {
UserDefaults.standard.set(currentTime, forKey: "bestTime")
bestTime = UserDefaults.standard.value(forKey: "bestTime") as! String
bestTimeLabel.text = bestTime
}
}
}