計算の試みelapsedTime
は正しくありません。Swift 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
ドキュメントが私たちに警告していることは注目に値します:
この関数を繰り返し呼び出しても、単調に増加する結果は保証されません。システム時刻は、外部の時刻参照との同期またはユーザーによる明示的な時計の変更が原因で減少する場合があります。
これは、これらの調整の1つが行われたときに経過時間を測定するのに不幸な場合、誤った経過時間の計算で終わる可能性があることを意味します。これはNSDate
/ Date
計算にも当てはまります。mach_absolute_time
ベースの計算を使用するのが最も安全です(で最も簡単に実行できますCACurrentMediaTime
)。
let start = CACurrentMediaTime()
そして
let elapsed = CACurrentMediaTime() - start
これはを使用しますmach_absolute_time
が、テクニカルQ&A QA1398で概説されている複雑さの一部を回避します。
ただし、デバイスを再起動するとCACurrentMediaTime
/ mach_absolute_time
がリセットされることに注意してください。つまり、アプリの実行中に正確な経過時間の計算が必要な場合は、を使用しますCACurrentMediaTime
。ただし、この開始時間を永続的なストレージに保存して、アプリを将来再起動したときに思い出すことができるようにするDate
場合はCFAbsoluteTimeGetCurrent
、またはを使用する必要があります。