Sua tentativa de calcular elapsedTimeestá incorreta. Em Swift 3, seria:
let elapsed = Date().timeIntervalSince(timeAtPress)
Observe o ()depois da Datereferência. O Date()instancia um novo objeto de data e, em seguida, timeIntervalSinceretorna 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 Intvalor, você pode apenas usar:
let duration = Int(elapsed)
E, BTW, sua definição da timeAtPressvariável não precisa instanciar um Dateobjeto. Eu presumo que você pretendia:
var timeAtPress: Date!
Isso define a variável como uma Datevariável (uma variável implicitamente desembrulhada), mas você presumivelmente adia a instanciação real dessa variável até que pressedseja 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 CFAbsoluteTimeGetCurrentdocumentaçã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/ Datecalculations. É mais seguro usar um mach_absolute_timecá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_timeserá 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 Dateou CFAbsoluteTimeGetCurrent, e apenas conviver com quaisquer imprecisões que possam acarretar.