計算の試み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、またはを使用する必要があります。