Upaya Anda untuk menghitung elapsedTimesalah. Di Swift 3, itu akan menjadi:
let elapsed = Date().timeIntervalSince(timeAtPress)
Perhatikan ()setelah Datereferensi. The Date()instantiates objek tanggal baru, dan kemudian timeIntervalSincemengembalikan perbedaan waktu antara itu dan timeAtPress. Itu akan mengembalikan nilai floating point (secara teknis, a TimeInterval).
Jika Anda ingin itu terpotong menjadi Intnilai, Anda bisa menggunakan:
let duration = Int(elapsed)
Dan, BTW, definisi Anda tentang timeAtPressvariabel tidak perlu membuat instance Dateobjek. Saya kira Anda bermaksud:
var timeAtPress: Date!
Itu mendefinisikan variabel sebagai Datevariabel (yang secara implisit tidak dibungkus), tetapi Anda mungkin akan menunda instansiasi aktual variabel itu sampai presseddipanggil.
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 CFAbsoluteTimeGetCurrentdokumentasi 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/ Datekalkulasi. Paling aman menggunakan mach_absolute_timepenghitungan 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_timeakan 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 Dateatau CFAbsoluteTimeGetCurrent, dan hidup dengan ketidakakuratan yang mungkin diperlukan.