您尝试计算elapsedTime
不正确。在斯威夫特3,这将是:
let elapsed = Date().timeIntervalSince(timeAtPress)
注意()
的Date
引用后。 Date()
实例化一个新的日期对象,然后timeIntervalSince
返回该与timeAtPress
之间的时间差。这将返回一个浮点值(技术上,一个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
,但避免了一些在Technical Q&A QA1398概述复杂性。
但请记住,当设备重新启动时,CACurrentMediaTime
/mach_absolute_time
将被重置。因此,如果您需要在应用程序运行时计算准确的经过时间,请使用CACurrentMediaTime
。但是,如果您要将此开始时间保存在永久性存储中,您可能还记得应用程序在未来某个日期重新启动的时间,那么您必须使用Date
或CFAbsoluteTimeGetCurrent
,并且可能存在任何可能不准确的情况。
来源
2014-10-28 01:11:38
Rob
哇,谢谢来抢!你的回答非常有帮助并且易于理解。我非常感谢关于CFAbsoluteTime的提示。我一定会用它! – Erik 2014-10-31 21:52:05
timeIntervalSinceDate的维度是什么? – eugene 2015-11-10 10:55:52
它返回['NSTimeInterval'](https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Miscellaneous/Foundation_DataTypes/index.html#//apple_ref/c/tdef/NSTimeInterval) ,它以秒数来衡量。 – Rob 2015-11-10 14:23:32