Sua tentativa de calcular elapsedTime
está incorreta. Em Swift 3, seria:
let elapsed = Date().timeIntervalSince(timeAtPress)
Observe o ()
depois da Date
referência. O Date()
instancia um novo objeto de data e, em seguida, timeIntervalSince
retorna a diferença de tempo entre esse e timeAtPress
. Isso retornará um valor de ponto flutuante (tecnicamente, a TimeInterval
).
Se quiser que seja truncado em um Int
valor, você pode apenas usar:
let duration = Int(elapsed)
E, BTW, sua definição da timeAtPress
variável não precisa instanciar um Date
objeto. Eu presumo que você pretendia:
var timeAtPress: Date!
Isso define a variável como uma Date
variável (uma variável implicitamente desembrulhada), mas você presumivelmente adia a instanciação real dessa variável até que pressed
seja chamada.
Como alternativa, costumo usar CFAbsoluteTimeGetCurrent()
, por exemplo,
var start: CFAbsoluteTime!
E quando quero definir startTime
, faço o seguinte:
start = CFAbsoluteTimeGetCurrent()
E quando quero calcular o número de segundos decorridos, faço o seguinte:
let elapsed = CFAbsoluteTimeGetCurrent() - start
Vale ressaltar que a CFAbsoluteTimeGetCurrent
documentação nos alerta:
Chamadas repetidas para esta função não garantem resultados monotonicamente crescentes. A hora do sistema pode diminuir devido à sincronização com referências de hora externas ou devido a uma mudança explícita do relógio pelo usuário.
Isso significa que, se você tiver a infelicidade de medir o tempo decorrido quando um desses ajustes ocorrer, poderá terminar com o cálculo incorreto do tempo decorrido. Isso também é válido para NSDate
/ Date
calculations. É mais seguro usar um mach_absolute_time
cálculo baseado (mais facilmente feito com CACurrentMediaTime
):
let start = CACurrentMediaTime()
e
let elapsed = CACurrentMediaTime() - start
Isso usa mach_absolute_time
, mas evita algumas de suas complexidades descritas nas Perguntas e respostas técnicas QA1398 .
Lembre-se, porém, de que CACurrentMediaTime
/ mach_absolute_time
será reiniciado quando o dispositivo for reiniciado. Portanto, se você precisar de cálculos precisos de tempo decorrido enquanto um aplicativo está em execução, use CACurrentMediaTime
. Mas se você vai economizar esse tempo de início no armazenamento persistente, que pode ser lembrado quando o aplicativo for reiniciado em alguma data futura, você terá que usar Date
ou CFAbsoluteTimeGetCurrent
, e apenas conviver com quaisquer imprecisões que possam acarretar.