您的计算尝试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
。但是,如果您打算将此开始时间保存在永久性存储中,您可能会在以后某个日期重新启动该应用程序时想起该时间,那么您必须使用Date
或CFAbsoluteTimeGetCurrent
,并且要承受可能带来的任何不准确之处。