swift AVPlayer -致命错误:双精度值无法转换为Int,因为它是无限或NaN

gcuhipw9  于 2023-01-25  发布在  Swift
关注(0)|答案(1)|浏览(218)

我有这个功能:

func getSeconds()->Int{
        
        return Int(Double(self.value) * (self.player.currentItem?.duration.seconds)!)
    }

有时会崩溃:
致命错误:双精度值无法转换为Int,因为它是无限或NaN
我当然见过这个:
Swift 3:fatal error: Double value cannot be converted to Int because it is either infinite or NaN
但是我到底要用多少呢?
这是什么?:

guard !(totalSeconds.isNaN || totalSeconds.isInfinite) else {
    return "illegal value"
}

如果一切正常我该去哪里?

    • 编辑:**

我现在是这样做的:

func getSeconds()->Int{
    
    let totalSeconds = self.player.currentItem?.duration.seconds
    
    if(totalSeconds != nil){
        guard !(totalSeconds!.isNaN || totalSeconds!.isInfinite) else {
            return 0 // or do some error handling
        }
        
        return Int(Double(self.value) * (self.player.currentItem?.duration.seconds)!)
    }else{
        return 0
    }
}

有道理吗?

pzfprimi

pzfprimi1#

正如您所链接问题的答案中提到的,代码用于验证值是否为有效数字。
您的编辑方向正确,但可能需要对可选选项的处理进行一些改进。以下内容可能会更好:

func getSeconds() -> Int {   
    guard let totalSeconds = self.player.currentItem?.duration.seconds,
        !totalSeconds.isNaN && !totalSeconds.isInfinite else { return 0 }
    
    return Int(Double(self.value) * totalSeconds)
}

guard首先得到self.player.currentItem?.duration.seconds的值,但前提是self.player.currentItem?.duration.seconds是一个非可选的值,如果self.player.currentItem当前为nil,那么就没有持续时间。
一旦guard获得一个以秒为单位的值,它将确保该值既不是NaN也不是无穷大。
因此,如果没有当前项可以获取持续时间,或者持续时间不是有限的数字,则将到达guardelse
如果您有一个正确的数字,代码可以继续计算并返回一个最终值。
注意在代码中没有使用强制解包。你应该避免这些来消除可能的崩溃。学习Swift中正确的可选处理是至关重要的。
正如您引用的答案的注解中所述,整个!(totalSeconds.isNaN || totalSeconds.isInfinite)可以写成totalSeconds.isFinite。在函数中这样做会将guard更改为:

guard let totalSeconds = self.player.currentItem?.duration.seconds,
    totalSeconds.isFinite else { return 0 }

在这种情况下,这更容易阅读,也更接近所需检查的要点。

相关问题