Upaya Anda untuk menghitung elapsedTime
salah. Di Swift 3, itu akan menjadi:
let elapsed = Date().timeIntervalSince(timeAtPress)
Perhatikan ()
setelah Date
referensi. The Date()
instantiates objek tanggal baru, dan kemudian timeIntervalSince
mengembalikan perbedaan waktu antara itu dan timeAtPress
. Itu akan mengembalikan nilai floating point (secara teknis, a TimeInterval
).
Jika Anda ingin itu terpotong menjadi Int
nilai, Anda bisa menggunakan:
let duration = Int(elapsed)
Dan, BTW, definisi Anda tentang timeAtPress
variabel tidak perlu membuat instance Date
objek. Saya kira Anda bermaksud:
var timeAtPress: Date!
Itu mendefinisikan variabel sebagai Date
variabel (yang secara implisit tidak dibungkus), tetapi Anda mungkin akan menunda instansiasi aktual variabel itu sampai pressed
dipanggil.
Alternatifnya, saya sering menggunakan CFAbsoluteTimeGetCurrent()
, misalnya,
var start: CFAbsoluteTime!
Dan ketika saya ingin mengatur startTime
, saya melakukan hal berikut:
start = CFAbsoluteTimeGetCurrent()
Dan ketika saya ingin menghitung jumlah detik yang telah berlalu, saya melakukan hal berikut:
let elapsed = CFAbsoluteTimeGetCurrent() - start
Perlu dicatat bahwa CFAbsoluteTimeGetCurrent
dokumentasi tersebut memperingatkan kita:
Panggilan berulang ke fungsi ini tidak menjamin hasil yang meningkat secara monoton. Waktu sistem dapat berkurang karena sinkronisasi dengan referensi waktu eksternal atau karena pengguna mengubah jam secara eksplisit.
Ini berarti bahwa jika Anda kurang beruntung untuk mengukur waktu yang berlalu ketika salah satu dari penyesuaian ini terjadi, Anda dapat berakhir dengan penghitungan waktu berlalu yang salah. Ini juga berlaku untuk NSDate
/ Date
kalkulasi. Paling aman menggunakan mach_absolute_time
penghitungan berbasis (paling mudah dilakukan dengan CACurrentMediaTime
):
let start = CACurrentMediaTime()
dan
let elapsed = CACurrentMediaTime() - start
Ini menggunakan mach_absolute_time
, tetapi menghindari beberapa kerumitan yang diuraikan dalam Tanya Jawab Teknis QA1398 .
Ingat, bagaimanapun, itu CACurrentMediaTime
/ mach_absolute_time
akan diatur ulang ketika perangkat di-boot ulang. Jadi, intinya, jika Anda membutuhkan penghitungan waktu berlalu yang akurat saat aplikasi sedang berjalan, gunakan CACurrentMediaTime
. Tetapi jika Anda akan menyimpan waktu mulai ini dalam penyimpanan persisten yang mungkin Anda ingat ketika aplikasi dimulai ulang di masa mendatang, maka Anda harus menggunakan Date
atau CFAbsoluteTimeGetCurrent
, dan hidup dengan ketidakakuratan yang mungkin diperlukan.