Votre tentative de calcul elapsedTime
est incorrecte. Dans Swift 3, ce serait:
let elapsed = Date().timeIntervalSince(timeAtPress)
Notez ()
après la Date
référence. Le Date()
instancie un nouvel objet date, puis timeIntervalSince
renvoie la différence de temps entre celui-ci et timeAtPress
. Cela renverra une valeur à virgule flottante (techniquement, a TimeInterval
).
Si vous voulez que cela soit tronqué à une Int
valeur, vous pouvez simplement utiliser:
let duration = Int(elapsed)
Et, BTW, votre définition de la timeAtPress
variable n'a pas besoin d'instancier un Date
objet. Je présume que vous aviez l'intention:
var timeAtPress: Date!
Cela définit la variable comme une Date
variable (une variable implicitement déballée), mais vous différeriez vraisemblablement l'instanciation réelle de cette variable jusqu'à ce qu'elle pressed
soit appelée.
Alternativement, j'utilise souvent CFAbsoluteTimeGetCurrent()
, par exemple,
var start: CFAbsoluteTime!
Et quand je veux régler startTime
, je fais ce qui suit:
start = CFAbsoluteTimeGetCurrent()
Et quand je veux calculer le nombre de secondes écoulées, je fais ce qui suit:
let elapsed = CFAbsoluteTimeGetCurrent() - start
Il convient de noter que la CFAbsoluteTimeGetCurrent
documentation nous avertit:
Les appels répétés à cette fonction ne garantissent pas des résultats à augmentation monotone. L'heure système peut diminuer en raison de la synchronisation avec des références de temps externes ou en raison d'un changement d'utilisateur explicite de l'horloge.
Cela signifie que si vous avez la malchance de mesurer le temps écoulé lorsque l'un de ces ajustements a lieu, vous pouvez vous retrouver avec un calcul du temps écoulé incorrect. Ceci est également vrai pour NSDate
/ Date
calculs. Il est plus sûr d'utiliser un mach_absolute_time
calcul basé (le plus facilement fait avec CACurrentMediaTime
):
let start = CACurrentMediaTime()
et
let elapsed = CACurrentMediaTime() - start
Cela utilise mach_absolute_time
, mais évite certaines de ses complexités décrites dans la Q&R technique QA1398 .
Rappelez-vous, cependant, que CACurrentMediaTime
/ mach_absolute_time
sera réinitialisé lorsque l'appareil sera redémarré. Donc, en fin de compte, si vous avez besoin de calculs précis du temps écoulé pendant qu'une application est en cours d'exécution, utilisez CACurrentMediaTime
. Mais si vous allez enregistrer cette heure de début dans un stockage persistant, dont vous vous souviendrez peut-être lorsque l'application sera redémarrée à une date ultérieure, vous devez utiliser Date
ou CFAbsoluteTimeGetCurrent
, et vivre avec toutes les inexactitudes qui peuvent entraîner.