ความพยายามในการคำนวณของคุณelapsedTimeไม่ถูกต้อง ใน Swift 3 จะเป็น:
let elapsed = Date().timeIntervalSince(timeAtPress)
สังเกต()หลังการDateอ้างอิง Date()instantiates วัตถุวันที่ใหม่แล้วผลตอบแทนที่แตกต่างของเวลาระหว่างที่และtimeIntervalSince timeAtPressซึ่งจะส่งคืนค่าทศนิยม (ในทางเทคนิค a TimeInterval)
หากคุณต้องการให้มีการตัดทอนเป็นIntค่าคุณสามารถใช้:
let duration = Int(elapsed)
และ BTW คำจำกัดความของtimeAtPressตัวแปรของคุณไม่จำเป็นต้องสร้างอินสแตนซ์Dateวัตถุ ฉันคิดว่าคุณตั้งใจ:
var timeAtPress: Date!
สิ่งนี้กำหนดตัวแปรเป็นDateตัวแปร (ตัวแปรที่ไม่ได้ปิดโดยปริยาย) แต่คุณอาจจะเลื่อนการสร้างอินสแตนซ์จริงของตัวแปรนั้นออกไปจนกว่าpressedจะมีการเรียก
หรือฉันมักจะใช้CFAbsoluteTimeGetCurrent()เช่น
var start: CFAbsoluteTime!
และเมื่อฉันต้องการตั้งค่าstartTimeฉันจะทำสิ่งต่อไปนี้:
start = CFAbsoluteTimeGetCurrent()
และเมื่อฉันต้องการคำนวณจำนวนวินาทีที่ผ่านไปฉันจะทำดังต่อไปนี้:
let elapsed = CFAbsoluteTimeGetCurrent() - start
เป็นที่น่าสังเกตว่าCFAbsoluteTimeGetCurrentเอกสารนี้เตือนเรา:
การเรียกใช้ฟังก์ชันนี้ซ้ำ ๆ ไม่ได้รับประกันผลลัพธ์ที่เพิ่มขึ้นอย่างจำเจ เวลาของระบบอาจลดลงเนื่องจากการซิงโครไนซ์กับการอ้างอิงเวลาภายนอกหรือเนื่องจากการเปลี่ยนนาฬิกาของผู้ใช้อย่างชัดเจน
ซึ่งหมายความว่าหากคุณโชคไม่ดีพอที่จะวัดเวลาที่ผ่านไปเมื่อมีการปรับเปลี่ยนอย่างใดอย่างหนึ่งคุณอาจต้องคำนวณเวลาที่ผ่านไปไม่ถูกต้อง นี่เป็นจริงสำหรับNSDate/ การDateคำนวณด้วย ปลอดภัยที่สุดในการใช้การmach_absolute_timeคำนวณตามเกณฑ์ (ทำได้ง่ายที่สุดด้วยCACurrentMediaTime):
let start = CACurrentMediaTime()
และ
let elapsed = CACurrentMediaTime() - start
การใช้งานนี้mach_absolute_timeแต่หลีกเลี่ยงบางส่วนของความซับซ้อนของมันที่ระบุไว้ในทางเทคนิค Q & A QA1398
อย่างไรก็ตามโปรดจำไว้ว่าCACurrentMediaTime/ mach_absolute_timeจะถูกรีเซ็ตเมื่อรีบูตอุปกรณ์ ดังนั้นบรรทัดด้านล่างถ้าคุณต้องการการคำนวณเวลาที่ผ่านไปที่ถูกต้องในขณะที่ app CACurrentMediaTimeยังทำงานอยู่ให้ใช้งาน แต่ถ้าคุณจะบันทึกเวลาเริ่มต้นนี้ไว้ในที่เก็บข้อมูลถาวรซึ่งคุณอาจจำได้เมื่อแอปเริ่มต้นใหม่ในวันที่ในอนาคตคุณต้องใช้DateหรือCFAbsoluteTimeGetCurrentและอยู่กับความไม่ถูกต้องที่อาจเกิดขึ้น