Hesaplama girişiminiz elapsedTime
yanlış. Swift 3'te şöyle olurdu:
let elapsed = Date().timeIntervalSince(timeAtPress)
Not ()
sonra Date
referans. Date()
Yeni bir tarih nesnesini, ve daha sonra timeIntervalSince
bu 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 Int
değere kısaltılmasını istiyorsanız, şunu kullanabilirsiniz:
let duration = Int(elapsed)
Ve, BTW, timeAtPress
değişken tanımınızın bir Date
nesneyi somutlaştırmasına gerek yoktur . Sanırım kastettiğin:
var timeAtPress: Date!
Bu, değişkeni bir Date
değ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
CFAbsoluteTimeGetCurrent
Belgelerin 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
/ Date
hesaplamalar için de geçerlidir. mach_absolute_time
Tabanlı 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_time
sı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 Date
veya kullanmanız CFAbsoluteTimeGetCurrent
ve ortaya çıkabilecek herhangi bir yanlışlıkla yaşamanız gerekir.