我有这个功能:
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
}
}
有道理吗?
1条答案
按热度按时间pzfprimi1#
正如您所链接问题的答案中提到的,代码用于验证值是否为有效数字。
您的编辑方向正确,但可能需要对可选选项的处理进行一些改进。以下内容可能会更好:
guard
首先得到self.player.currentItem?.duration.seconds
的值,但前提是self.player.currentItem?.duration.seconds
是一个非可选的值,如果self.player.currentItem
当前为nil,那么就没有持续时间。一旦
guard
获得一个以秒为单位的值,它将确保该值既不是NaN也不是无穷大。因此,如果没有当前项可以获取持续时间,或者持续时间不是有限的数字,则将到达
guard
的else
。如果您有一个正确的数字,代码可以继续计算并返回一个最终值。
注意在代码中没有使用强制解包。你应该避免这些来消除可能的崩溃。学习Swift中正确的可选处理是至关重要的。
正如您引用的答案的注解中所述,整个
!(totalSeconds.isNaN || totalSeconds.isInfinite)
可以写成totalSeconds.isFinite
。在函数中这样做会将guard
更改为:在这种情况下,这更容易阅读,也更接近所需检查的要点。