Произошла неправильная установка 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
, но избегает некоторых своих сложностей, изложенных в Technical Q&A QA1398.
Помните, что CACurrentMediaTime
/mach_absolute_time
сбрасывается при перезагрузке устройства. Итак, в нижней строке, если вам нужны точные расчеты прошедшего времени во время работы приложения, используйте CACurrentMediaTime
. Но если вы собираетесь сохранить это время начала в постоянном хранилище, которое вы могли бы вспомнить, когда приложение будет перезапущено в какой-то будущий день, тогда вы должны использовать Date
или CFAbsoluteTimeGetCurrent
и просто жить с любыми неточностями, которые могут возникнуть.
Вау, спасибо Роб! Ваш ответ был очень полезным и понятным. Я очень ценю подсказку о CFAbsoluteTime. Я определенно буду использовать это! – Erik
Каково измерение для timeIntervalSinceDate? – eugene
Он возвращает ['NSTimeInterval'] (https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Miscellaneous/Foundation_DataTypes/index.html#//apple_ref/c/tdef/NSTimeInterval) , который измеряется как количество секунд. – Rob