ความพยายามในการคำนวณของคุณ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
และอยู่กับความไม่ถูกต้องที่อาจเกิดขึ้น