您嘗試計算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