Ihr Berechnungsversuch elapsedTime
ist falsch. In Swift 3 wäre es:
let elapsed = Date().timeIntervalSince(timeAtPress)
Beachten Sie die ()
nach der Date
Referenz. Das Date()
instanziiert ein neues Datumsobjekt und gibt dann timeIntervalSince
die Zeitdifferenz zwischen diesem und zurück timeAtPress
. Dies gibt einen Gleitkommawert zurück (technisch gesehen a TimeInterval
).
Wenn Sie möchten, dass das auf einen Int
Wert abgeschnitten wird, können Sie einfach Folgendes verwenden:
let duration = Int(elapsed)
Übrigens muss Ihre Definition der timeAtPress
Variablen kein Date
Objekt instanziieren . Ich nehme an, Sie haben beabsichtigt:
var timeAtPress: Date!
Das definiert die Variable als eine Date
Variable (eine implizit entpackte Variable), aber Sie würden vermutlich die tatsächliche Instanziierung dieser Variablen verschieben, bis sie pressed
aufgerufen wird.
Alternativ benutze ich oft CFAbsoluteTimeGetCurrent()
zB
var start: CFAbsoluteTime!
Und wenn ich einstellen möchte startTime
, mache ich Folgendes:
start = CFAbsoluteTimeGetCurrent()
Und wenn ich die Anzahl der verstrichenen Sekunden berechnen möchte, gehe ich wie folgt vor:
let elapsed = CFAbsoluteTimeGetCurrent() - start
Es ist erwähnenswert, dass die CFAbsoluteTimeGetCurrent
Dokumentation uns warnt:
Wiederholte Aufrufe dieser Funktion garantieren keine monoton steigenden Ergebnisse. Die Systemzeit kann sich aufgrund der Synchronisation mit externen Zeitreferenzen oder aufgrund einer expliziten Änderung der Uhr durch den Benutzer verringern.
Dies bedeutet, dass Sie möglicherweise eine falsche Berechnung der verstrichenen Zeit erhalten, wenn Sie das Pech haben, die verstrichene Zeit zu messen, wenn eine dieser Anpassungen vorgenommen wird. Dies gilt auch für NSDate
/ Date
Berechnungen. Es ist am sichersten, eine mach_absolute_time
basierte Berechnung zu verwenden (am einfachsten durchzuführen CACurrentMediaTime
):
let start = CACurrentMediaTime()
und
let elapsed = CACurrentMediaTime() - start
Dies nutzt mach_absolute_time
, vermeidet jedoch einige seiner Komplexitäten, die in den technischen Fragen und Antworten QA1398 beschrieben sind .
Denken Sie jedoch daran, dass CACurrentMediaTime
/ mach_absolute_time
beim Neustart des Geräts zurückgesetzt wird. Fazit: Wenn Sie während der Ausführung einer App genaue Berechnungen der verstrichenen Zeit benötigen, verwenden Sie CACurrentMediaTime
. Wenn Sie diese Startzeit jedoch in einem dauerhaften Speicher speichern möchten, an den Sie sich möglicherweise erinnern, wenn die App zu einem späteren Zeitpunkt neu gestartet wird, müssen Sie Date
oder verwenden CFAbsoluteTimeGetCurrent
und nur mit eventuell auftretenden Ungenauigkeiten leben.
TimeInterval
, das in Sekunden gemessen wird.NSDate () und NSCalendar () klingen nach einer guten Wahl. Verwenden Sie die Kalenderberechnung und überlassen Sie den eigentlichen mathematischen Teil dem Framework. Hier ist ein kurzes Beispiel für das Abrufen der Sekunden zwischen zwei
NSDate()
quelle
Nach der Antwort des Freddy ist dies die Funktion in Swift 3:
quelle
Swift 5
quelle
So können Sie den Unterschied in der neuesten Version von Swift 3 erkennen
Referenz: Ermitteln der Differenz zwischen zwei NSDates in (Monate / Tage / Stunden / Minuten / Sekunden)
quelle
Swift 5
quelle
Für Swift 3 Sekunden zwischen 2 Mal in "hh: mm"
Verwendung
quelle