Tu intento de calcular elapsedTime
es incorrecto. En Swift 3, sería:
let elapsed = Date().timeIntervalSince(timeAtPress)
Tenga en cuenta el ()
después de la Date
referencia. La Date()
instancia un nuevo objeto de fecha y, a continuación, timeIntervalSince
devuelve la diferencia de tiempo entre eso y timeAtPress
. Eso devolverá un valor de punto flotante (técnicamente, a TimeInterval
).
Si desea que se trunque a un Int
valor, puede usar:
let duration = Int(elapsed)
Y, por cierto, su definición de la timeAtPress
variable no necesita instanciar un Date
objeto. Supongo que pretendías:
var timeAtPress: Date!
Eso define la variable como una Date
variable (una implícitamente desenvuelta), pero presumiblemente aplazaría la instanciación real de esa variable hasta que pressed
se llame.
Alternativamente, a menudo uso CFAbsoluteTimeGetCurrent()
, por ejemplo,
var start: CFAbsoluteTime!
Y cuando quiero configurar startTime
, hago lo siguiente:
start = CFAbsoluteTimeGetCurrent()
Y cuando quiero calcular la cantidad de segundos transcurridos, hago lo siguiente:
let elapsed = CFAbsoluteTimeGetCurrent() - start
Vale la pena señalar que la CFAbsoluteTimeGetCurrent
documentación nos advierte:
Las llamadas repetidas a esta función no garantizan resultados que aumenten monótonamente. La hora del sistema puede disminuir debido a la sincronización con referencias de tiempo externas o debido a un cambio explícito del reloj por parte del usuario.
Esto significa que si tiene la mala suerte de medir el tiempo transcurrido cuando se realiza uno de estos ajustes, puede terminar con un cálculo incorrecto del tiempo transcurrido. Esto también es cierto para los cálculos NSDate
/ Date
. Es más seguro utilizar un mach_absolute_time
cálculo basado (se hace más fácil con CACurrentMediaTime
):
let start = CACurrentMediaTime()
y
let elapsed = CACurrentMediaTime() - start
Esto utiliza mach_absolute_time
, pero evita algunas de sus complejidades descritas en Preguntas y respuestas técnicas QA1398 .
Sin embargo, recuerde que CACurrentMediaTime
/ mach_absolute_time
se restablecerá cuando se reinicie el dispositivo. Entonces, en resumen, si necesita cálculos precisos del tiempo transcurrido mientras se ejecuta una aplicación, use CACurrentMediaTime
. Pero si va a guardar esta hora de inicio en un almacenamiento persistente que podría recordar cuando la aplicación se reinicie en una fecha futura, entonces debe usar Date
o CFAbsoluteTimeGetCurrent
, y simplemente vivir con cualquier inexactitud que pueda implicar.