接收致命错误:双精度值不能转换为Int,因为它是无穷大或NaN

时间:2018-11-30 05:03:35

标签: swift nan cmtime

该代码用于播客应用。

import AVKit

extension CMTime {
func toDisplayString() -> String {
    let totalSeconds = Int(CMTimeGetSeconds(self))
    let seconds = totalSeconds % 60
    let minutes = totalSeconds / 60
    let timeFormatString = String(format: "%02d:%02d", minutes, seconds)
    return timeFormatString
}
}

选择要播放的播客时失败...导致播放音频,但应用程序冻结直到重新启动。

编辑:错误发生在第let totalSeconds = Int(CMTimeGetSeconds(self))

2 个答案:

答案 0 :(得分:2)

来自CMTimeGetSeconds documentation

  

如果CMTime无效或不确定,则返回NaN。如果CMTime   是无限的,则返回+/-无限。

CMTimeGetSeconds返回NaN或无穷大时,将返回值强制转换为Int将引发您所看到的致命错误。

您可以先检查该值,然后在无效数字的情况下返回某种默认值。

func toDisplayString() -> String {
    let rawSeconds = CMTimeGetSeconds(self)
    guard !(rawSeconds.isNaN || rawSeconds.isInfinite) else {
       return "--" // or some other default string
    }
    let totalSeconds = Int(rawSeconds)
    let seconds = totalSeconds % 60
    let minutes = totalSeconds / 60
    let timeFormatString = String(format: "%02d:%02d", minutes, seconds)
    return timeFormatString
}

答案 1 :(得分:1)

以下代码应该可以工作...基本上是这样,因为CMTimeGetSeconds(self)返回的值超出了Int的限制。

func toDisplayString() -> String {
        let totalSeconds:TimeInterval = TimeInterval(CMTimeGetSeconds(self))
        let seconds:TimeInterval = totalSeconds.truncatingRemainder(dividingBy: 60)
        let minutes:TimeInterval = totalSeconds / 60
        let timeFormatString = String(format: "%02d:%02d", minutes, seconds)
        return timeFormatString
    }