Il tuo tentativo di calcolo elapsedTimenon è corretto. In Swift 3, sarebbe:
let elapsed = Date().timeIntervalSince(timeAtPress)
Nota il ()dopo il Dateriferimento. La Date()un'istanza di un nuovo oggetto data, quindi timeIntervalSincerestituisce la differenza di tempo tra questo e timeAtPress. Ciò restituirà un valore in virgola mobile (tecnicamente, aTimeInterval ).
Se vuoi che venga troncato a un Intvalore, puoi semplicemente usare:
let duration = Int(elapsed)
E, BTW, la tua definizione della timeAtPressvariabile non ha bisogno di istanziare un Dateoggetto. Presumo tu intendessi:
var timeAtPress: Date!
Ciò definisce la variabile come una Datevariabile (implicitamente scartata), ma presumibilmente rimanderai l'istanza effettiva di quella variabile fino a quando non pressedverrà chiamata.
In alternativa, uso spesso CFAbsoluteTimeGetCurrent(), ad esempio,
var start: CFAbsoluteTime!
E quando voglio impostare startTime, faccio quanto segue:
start = CFAbsoluteTimeGetCurrent()
E quando voglio calcolare il numero di secondi trascorsi, faccio quanto segue:
let elapsed = CFAbsoluteTimeGetCurrent() - start
Vale la pena notare che la CFAbsoluteTimeGetCurrentdocumentazione ci avverte:
Chiamate ripetute a questa funzione non garantiscono risultati crescenti in modo monotono. L'ora di sistema può diminuire a causa della sincronizzazione con riferimenti temporali esterni oa causa di una modifica esplicita dell'orologio da parte dell'utente.
Ciò significa che se sei abbastanza sfortunato da misurare il tempo trascorso quando si verifica una di queste regolazioni, puoi finire con un calcolo del tempo trascorso errato. Questo vale anche per i calcoli NSDate/ Date. È più sicuro utilizzare un mach_absolute_timecalcolo basato (più facilmente eseguito con CACurrentMediaTime):
let start = CACurrentMediaTime()
e
let elapsed = CACurrentMediaTime() - start
Questo utilizza mach_absolute_time, ma evita alcune delle sue complessità descritte in Domande e risposte tecniche QA1398 .
Ricorda, tuttavia, che CACurrentMediaTime/ mach_absolute_timeverrà ripristinato al riavvio del dispositivo. Quindi, in conclusione, se hai bisogno di calcoli accurati del tempo trascorso mentre un'app è in esecuzione, usa CACurrentMediaTime. Ma se hai intenzione di salvare questa ora di inizio in una memoria persistente che potresti ricordare quando l'app viene riavviata in una data futura, devi usare Dateo CFAbsoluteTimeGetCurrente convivere con eventuali inesattezze che potrebbero comportare.