您的计算尝试
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,并且要避免可能出现的任何不准确之处。



