Il tuo tentativo di calcolo elapsedTime
non è corretto. In Swift 3, sarebbe:
let elapsed = Date().timeIntervalSince(timeAtPress)
Nota il ()
dopo il Date
riferimento. La Date()
un'istanza di un nuovo oggetto data, quindi timeIntervalSince
restituisce la differenza di tempo tra questo e timeAtPress
. Ciò restituirà un valore in virgola mobile (tecnicamente, aTimeInterval
).
Se vuoi che venga troncato a un Int
valore, puoi semplicemente usare:
let duration = Int(elapsed)
E, BTW, la tua definizione della timeAtPress
variabile non ha bisogno di istanziare un Date
oggetto. Presumo tu intendessi:
var timeAtPress: Date!
Ciò definisce la variabile come una Date
variabile (implicitamente scartata), ma presumibilmente rimanderai l'istanza effettiva di quella variabile fino a quando non pressed
verrà 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 CFAbsoluteTimeGetCurrent
documentazione 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_time
calcolo 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_time
verrà 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 Date
o CFAbsoluteTimeGetCurrent
e convivere con eventuali inesattezze che potrebbero comportare.