Hesaplama girişiminiz elapsedTimeyanlış. Swift 3'te şöyle olurdu:
let elapsed = Date().timeIntervalSince(timeAtPress)
Not ()sonra Datereferans. Date()Yeni bir tarih nesnesini, ve daha sonra timeIntervalSincebu arasındaki zaman farkını döndürür timeAtPress. Bu bir kayan nokta değeri döndürecektir (teknik olarak, a TimeInterval).
Bunun bir Intdeğere kısaltılmasını istiyorsanız, şunu kullanabilirsiniz:
let duration = Int(elapsed)
Ve, BTW, timeAtPressdeğişken tanımınızın bir Datenesneyi somutlaştırmasına gerek yoktur . Sanırım kastettiğin:
var timeAtPress: Date!
Bu, değişkeni bir Datedeğişken (örtük olarak sarmalanmamış) olarak tanımlar , ancak muhtemelen bu değişkenin gerçek somutlaştırılmasını pressedçağrılana kadar ertelersiniz .
Alternatif olarak, sık sık kullanıyorum CFAbsoluteTimeGetCurrent(), ör.
var start: CFAbsoluteTime!
Ve ayarlamak istediğimde startTimeşunları yapıyorum:
start = CFAbsoluteTimeGetCurrent()
Ve geçen saniye sayısını hesaplamak istediğimde aşağıdakileri yapıyorum:
let elapsed = CFAbsoluteTimeGetCurrent() - start
CFAbsoluteTimeGetCurrentBelgelerin bizi uyardığını belirtmekte fayda var :
Bu işleve yapılan tekrarlanan çağrılar, tekdüze olarak artan sonuçları garanti etmez. Sistem zamanı, harici zaman referanslarıyla senkronizasyon nedeniyle veya saatin açık bir kullanıcı değişikliği nedeniyle azalabilir.
Bu, bu ayarlamalardan biri gerçekleştiğinde geçen zamanı ölçecek kadar talihsizseniz, yanlış geçen zaman hesaplamasıyla sonuçlanabileceğiniz anlamına gelir. Bu, NSDate/ Datehesaplamalar için de geçerlidir. mach_absolute_timeTabanlı bir hesaplama kullanmak en güvenli yoldur (en kolay şekilde aşağıdakilerle yapılır CACurrentMediaTime):
let start = CACurrentMediaTime()
ve
let elapsed = CACurrentMediaTime() - start
Bu kullanır mach_absolute_time, ancak Teknik Soru-Cevap QA1398'de belirtilen karmaşıklıklarından bazılarını önler .
Cihaz yeniden başlatıldığında bunun CACurrentMediaTime/ mach_absolute_timesıfırlanacağını unutmayın . Sonuç olarak, bir uygulama çalışırken doğru geçen süre hesaplamalarına ihtiyacınız varsa, kullanın CACurrentMediaTime. Ancak, bu başlangıç zamanını, uygulama ileri bir tarihte yeniden başlatıldığında hatırlayabileceğiniz kalıcı depolamaya kaydedecekseniz, o zaman Dateveya kullanmanız CFAbsoluteTimeGetCurrentve ortaya çıkabilecek herhangi bir yanlışlıkla yaşamanız gerekir.