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