Ваша спроба обчислити 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просто жити з будь-якими неточностями, які можуть спричинити.