Ваша попытка вычислить 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
предупреждает нас:
Повторные вызовы этой функции не гарантируют монотонно возрастающих результатов. Системное время может уменьшиться из-за синхронизации с внешними эталонами времени или из-за явного изменения часов пользователем.
Это означает, что если вам не повезло измерить прошедшее время, когда происходит одна из этих корректировок, вы можете получить неправильный расчет прошедшего времени. Это справедливо и для расчетов NSDate
/Date
. Безопаснее всего использовать расчет на основе mach_absolute_time
(наиболее легко сделать с помощью CACurrentMediaTime
):
let start = CACurrentMediaTime()
и
let elapsed = CACurrentMediaTime() - start
Здесь используется mach_absolute_time
, но избегаются некоторые сложности, описанные в Технические вопросы и ответы QA1398 а>.
Однако помните, что CACurrentMediaTime
/mach_absolute_time
будут сброшены при перезагрузке устройства. Итак, в итоге, если вам нужны точные расчеты затраченного времени во время работы приложения, используйте CACurrentMediaTime
. Но если вы собираетесь сохранить это время запуска в постоянном хранилище, которое вы можете вспомнить, когда приложение будет перезапущено в будущем, вам придется использовать Date
или CFAbsoluteTimeGetCurrent
и просто смириться с любыми неточностями, которые могут возникнуть.
person
Rob
schedule
28.10.2014