小编典典

使用Swift查找NSDate之间的秒数差异(整数)

swift

我正在编写一段代码,我想在其中计时按下按钮的时间。为此,我记录了NSDate()按下按钮时的记录,并尝试timeIntervalSinceDate在释放按钮时使用该功能。这似乎可行,但是我找不到任何方法来打印结果或将其切换为整数。

var timeAtPress = NSDate()

@IBAction func pressed(sender: AnyObject) {
    println("pressed")
    timeAtPress = NSDate()
}

@IBAction func released(sender: AnyObject) {
    println("released")
    var elapsedTime = NSDate.timeIntervalSinceDate(timeAtPress)
    duration = ???
}

我已经看到了一些类似的问题,但是我不知道C,所以我很难理解给出的答案。如果有一种更有效的方法来找出按下按钮的时间,我可以提出建议。提前致谢。


阅读 482

收藏
2020-07-07

共1个答案

小编典典

您的计算尝试elapsedTime不正确。在Swift 3中,它将是:

let elapsed = Date().timeIntervalSince(timeAtPress)

请注意参考()之后的内容Date。该Date()实例化一个新的日期对象,然后timeIntervalSince返回和之间的时间差timeAtPress。这将返回一个浮点值(技术上为a
TimeInterval)。

如果您希望将其截断为一个Int值,则可以使用:

let duration = Int(elapsed)

而且,顺便说一句,您对timeAtPress变量的定义不需要实例化Date对象。我想你打算:

var timeAtPress: Date!

它将变量定义为一个Date变量(一个隐式解开的变量),但是您可能会将该变量的实际实例推迟到pressed被调用之前。


另外,我经常使用CFAbsoluteTimeGetCurrent(),例如

var start: CFAbsoluteTime!

当我要设置时startTime,请执行以下操作:

start = CFAbsoluteTimeGetCurrent()

当我想计算经过的秒数时,请执行以下操作:

let elapsed = CFAbsoluteTimeGetCurrent() - start

值得注意的是CFAbsoluteTimeGetCurrent文档警告我们:

重复调用此函数不能保证单调递增的结果。系统时间可能由于与外部时间参考同步或由于用户明确更改时钟而减少。

这意味着,如果在进行这些调整之一时,如果您不足以测量经过时间,则最终可能会得出错误的经过时间计算结果。对于NSDate/
Date计算也是如此。使用mach_absolute_time基于计算的最安全的方法(最容易通过进行CACurrentMediaTime):

let start = CACurrentMediaTime()

let elapsed = CACurrentMediaTime() - start

这使用mach_absolute_time但避免了技术问答QA1398中概述的某些复杂性。

但是请记住,重新启动设备后,CACurrentMediaTime/
mach_absolute_time将会重置。因此,最重要的是,如果您在运行应用程序时需要准确的经过时间计算,请使用CACurrentMediaTime。但是,如果您打算将此开始时间保存在永久性存储中,您可能会在以后某个日期重新启动该应用程序时想起该时间,那么您必须使用DateCFAbsoluteTimeGetCurrent,并且要避免可能出现的任何不准确之处。

2020-07-07