Twoja próba obliczenia elapsedTime
jest nieprawidłowa. W Swift 3 byłoby to:
let elapsed = Date().timeIntervalSince(timeAtPress)
Zwróć uwagę ()
na Date
odwołanie. Date()
Tworzy nową instancję obiektu Date, a następnie timeIntervalSince
zwraca różnicę czasu między tym a timeAtPress
. To zwróci wartość zmiennoprzecinkową (technicznie a TimeInterval
).
Jeśli chcesz, aby było to obcięte do Int
wartości, możesz po prostu użyć:
let duration = Int(elapsed)
A tak przy okazji, twoja definicja timeAtPress
zmiennej nie musi tworzyć instancji Date
obiektu. Zakładam, że zamierzałeś:
var timeAtPress: Date!
To definiuje zmienną jako Date
zmienną (niejawnie nieopakowaną), ale prawdopodobnie odroczyłbyś rzeczywistą instancję tej zmiennej do momentu pressed
wywołania.
Alternatywnie często używam CFAbsoluteTimeGetCurrent()
np.
var start: CFAbsoluteTime!
A kiedy chcę ustawić startTime
, wykonuję następujące czynności:
start = CFAbsoluteTimeGetCurrent()
A kiedy chcę obliczyć liczbę sekund, które upłynęły, wykonuję następujące czynności:
let elapsed = CFAbsoluteTimeGetCurrent() - start
Warto zaznaczyć, że CFAbsoluteTimeGetCurrent
dokumentacja ostrzega nas:
Wielokrotne wywołania tej funkcji nie gwarantują monotonnie rosnących wyników. Czas systemowy może ulec skróceniu z powodu synchronizacji z zewnętrznymi odniesieniami czasu lub z powodu jawnej zmiany zegara przez użytkownika.
Oznacza to, że jeśli masz nieszczęście mierzyć czas, który upłynął, gdy ma miejsce jedna z tych korekt, możesz skończyć z niepoprawnym obliczeniem czasu, który upłynął. Dotyczy to również NSDate
/ Date
obliczeń. Najbezpieczniej jest skorzystać z mach_absolute_time
obliczeń opartych (najłatwiej zrobić za pomocą CACurrentMediaTime
):
let start = CACurrentMediaTime()
i
let elapsed = CACurrentMediaTime() - start
Używa mach_absolute_time
, ale pozwala uniknąć niektórych zawiłości opisanych w pytaniach technicznych QA1398 .
Pamiętaj jednak, że CACurrentMediaTime
/ mach_absolute_time
zostanie zresetowany po ponownym uruchomieniu urządzenia. Podsumowując, jeśli potrzebujesz dokładnych obliczeń czasu, który upłynął, gdy aplikacja jest uruchomiona, użyj CACurrentMediaTime
. Ale jeśli zamierzasz zapisać ten czas rozpoczęcia w trwałej pamięci, którą możesz sobie przypomnieć, gdy aplikacja zostanie ponownie uruchomiona w przyszłości, musisz użyć Date
lub CFAbsoluteTimeGetCurrent
i po prostu żyć z wszelkimi niedokładnościami, które mogą się z tym wiązać.