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