계산하려는 시도 elapsedTime
가 잘못되었습니다. Swift 3에서는 다음과 같습니다.
let elapsed = Date().timeIntervalSince(timeAtPress)
참조 ()
후 유의하십시오 Date
. 는 Date()
새 날짜 객체를 인스턴스화 한 다음 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
가 재설정됩니다. 따라서 결론적으로 앱이 실행되는 동안 정확한 경과 시간 계산이 필요한 경우 CACurrentMediaTime
. 그러나이 시작 시간을 영구 저장소에 저장하려는 경우 나중에 앱이 다시 시작될 때 기억할 수있는 경우에는 Date
또는 을 사용해야 CFAbsoluteTimeGetCurrent
하며 수반 될 수있는 모든 부정확성을 유지해야합니다.