Ich schreibe einen Code, in dem ich festlegen möchte, wie lange eine Taste gedrückt wurde. Dazu habe ich beim Drücken der Taste eine NSDate()
aufgenommen und beim Loslassen der Taste die timeIntervalSinceDate
-Funktion ausprobiert. Das scheint zu funktionieren, aber ich finde keine Möglichkeit, das Ergebnis zu drucken oder auf eine Ganzzahl umzurechnen.
var timeAtPress = NSDate()
@IBAction func pressed(sender: AnyObject) {
println("pressed")
timeAtPress = NSDate()
}
@IBAction func released(sender: AnyObject) {
println("released")
var elapsedTime = NSDate.timeIntervalSinceDate(timeAtPress)
duration = ???
}
Ich habe ein paar ähnliche Fragen gesehen, aber ich kenne C nicht, daher fiel es mir schwer, die Antworten zu verstehen. Wenn es eine effizientere Methode gibt, um herauszufinden, wie lange der Knopf gedrückt wurde, bin ich für Vorschläge offen. Danke im Voraus.
Ihr Versuch, elapsedTime
zu berechnen, ist falsch. In Swift 3 wäre es:
let elapsed = Date().timeIntervalSince(timeAtPress)
Beachten Sie den ()
nach der Date
-Referenz. Date()
instanziiert ein neues Datumsobjekt und gibt timeIntervalSince
die Zeitdifferenz zwischen diesem und timeAtPress
zurück. Dies gibt einen Gleitkommawert zurück (technisch gesehen ein TimeInterval
).
Wenn Sie möchten, dass der Wert auf einen Int
-Wert gekürzt wird, können Sie einfach Folgendes verwenden:
let duration = Int(elapsed)
Übrigens, Ihre Definition der Variable timeAtPress
muss kein Date
-Objekt instanziieren. Ich nehme an, Sie beabsichtigten:
var timeAtPress: Date!
Das definiert die Variable als Date
-Variable (eine implizit nicht verpackte), aber Sie würden vermutlich die tatsächliche Instantiierung dieser Variablen verschieben, bis pressed
aufgerufen wird.
Alternativ verwende ich oft CFAbsoluteTimeGetCurrent()
, z.
var start: CFAbsoluteTime!
Und wenn ich startTime
einstellen möchte, mache ich Folgendes:
start = CFAbsoluteTimeGetCurrent()
Und wenn ich die Anzahl der verstrichenen Sekunden berechnen möchte, mache ich Folgendes:
let elapsed = CFAbsoluteTimeGetCurrent() - start
Es ist erwähnenswert, dass die Dokumentation CFAbsoluteTimeGetCurrent
uns warnt:
Wiederholte Aufrufe dieser Funktion garantieren keine monoton steigenden Ergebnisse. Die Systemzeit kann sich aufgrund der Synchronisierung mit externen Zeitreferenzen oder aufgrund eines expliziten Benutzerwechsels der Uhr verringern.
Dies bedeutet, dass Sie, wenn Sie unglücklich genug sind, um die abgelaufene Zeit zu messen, wenn eine dieser Anpassungen stattfindet, zu einer falschen Berechnung der abgelaufenen Zeit führen können. Dies gilt auch für NSDate
/Date
-Berechnungen. Es ist am sichersten, eine mach_absolute_time
-basierte Berechnung zu verwenden (am einfachsten mit CACurrentMediaTime
):
let start = CACurrentMediaTime()
und
let elapsed = CACurrentMediaTime() - start
Dies verwendet mach_absolute_time
, vermeidet jedoch einige der in Technische Fragen und Antworten QA1398 beschriebenen Komplexitäten.
Denken Sie jedoch daran, dass CACurrentMediaTime
/mach_absolute_time
beim Neustart des Geräts zurückgesetzt wird. Unterm Strich also, wenn Sie genaue Berechnungen der abgelaufenen Zeit benötigen, während eine App ausgeführt wird, verwenden Sie CACurrentMediaTime
. Wenn Sie diese Startzeit jedoch in einem permanenten Speicher speichern möchten, an den Sie sich möglicherweise erinnern, wenn die App zu einem späteren Zeitpunkt erneut gestartet wird, müssen Sie Date
oder CFAbsoluteTimeGetCurrent
verwenden, und Sie müssen nur mit eventuellen Ungenauigkeiten leben.
NSDate () und NSCalendar () klingen nach einer guten Wahl. Verwenden Sie die Kalenderberechnung und überlassen Sie den eigentlichen mathematischen Teil dem Framework. Hier ist ein schnelles Beispiel, wie man die Sekunden zwischen zwei NSDate()
bekommt.
let startDate = NSDate()
let endDate = NSDate()
let calendar = NSCalendar.currentCalendar()
let dateComponents = calendar.components(NSCalendarUnit.CalendarUnitSecond, fromDate: startDate, toDate: endDate, options: nil)
let seconds = dateComponents.second
println("Seconds: \(seconds)")
Entsprechend der Antwort von Freddy ist dies die Funktion in Swift 3:
let start = Date()
let enddt = Date(timeIntervalSince1970: 100)
let calendar = Calendar.current
let unitFlags = Set<Calendar.Component>([ .second])
let datecomponenets = calendar.dateComponents(unitFlags, from: start, to: enddt)
let seconds = datecomponenets.second
print("Seconds: \(seconds)")
Swift 5
let startDate = Date()
let endDate = Date()
let calendar = Calendar.current
let dateComponents = calendar.compare(startDate, to: endDate, toGranularity: .second)
let seconds = dateComponents.rawValue
print("Seconds: \(seconds)")
So können Sie den Unterschied in der neuesten Version von Swift 3 feststellen
let calendar = NSCalendar.current
var compos:Set<Calendar.Component> = Set<Calendar.Component>()
compos.insert(.second)
compos.insert(.minute)
let difference = calendar.dateComponents(compos, from: fromDate, to: toDate)
print("diff in minute=\(difference.minute!)") // difference in minute
print("diff in seconds=\(difference.second!)") // difference in seconds
Referenz: Den Unterschied zwischen zwei NSDaten in (Monate/Tage/Stunden/Minuten/Sekunden) ermitteln