Swift 3:致命错误:Double 值无法转换为 Int,因为它是无限的或 NaN

Posted

技术标签:

【中文标题】Swift 3:致命错误:Double 值无法转换为 Int,因为它是无限的或 NaN【英文标题】:Swift 3:fatal error: Double value cannot be converted to Int because it is either infinite or NaN 【发布时间】:2017-02-02 10:43:11 【问题描述】:

当我调用这个方法时,收到一个错误。在分配小时、分钟或秒时如何处理 NaN 或无限值?

这是我的代码:

private func secondsToFormattedString(totalSeconds: Float64) -> String
    let hours:Int = Int(totalSeconds.truncatingRemainder(dividingBy: 86400) / 3600)

    let minutes:Int = Int(totalSeconds.truncatingRemainder(dividingBy: 3600) / 60)
    let seconds:Int = Int(totalSeconds.truncatingRemainder(dividingBy: 60))

    if hours > 0 
        return String(format: "%i:%02i:%02i", hours, minutes, seconds)
     else 
        return String(format: "%02i:%02i", minutes, seconds)
    

【问题讨论】:

考虑使用TimeIntervalDateComponentsFormatter 怎么调用函数,出现问题时totalSeconds的值是多少? – 一个独立的、可重现的测试用例会很有帮助。 【参考方案1】:

您应该检查totalSeconds 是否为有效值,例如:

guard !(totalsSeconds.isNaN || totalSeconds.isInfinite) else 
    return "illegal value" // or do some error handling

检查一下: Convert Float to Int in Swift

【讨论】:

nan 和 infinity 都不是有限的,所以你可以直接说 guard totalSeconds.isFinite else ... @Hamish 你是绝对正确的。我只是想指出不同的 API,因为原始问题明确提到了 NaN 和 Infinity。【参考方案2】:

另一种选择是为此使用格式化程序,我只是想将 Double 转换为 Int 以便更容易在我的 UI 中显示,所以 NumberFormatter 是完美的,我的 Double 是 NaN 所以这就是 @987654322 @ 提供给我,而不是 Int 'cast' 提供的 fatalError (为什么它不返回像 Int(String) 那样的可选值?)

但在这个问题的上下文中,DateFormatter 是一个很好的解决方案,它可以为您完成整个功能的工作(请记住,创建 DateFormatters 的成本有点高,所以您不想创建为您所做的每种字符串格式设置一个,但如果有意义,请保留它)

【讨论】:

以上是关于Swift 3:致命错误:Double 值无法转换为 Int,因为它是无限的或 NaN的主要内容,如果未能解决你的问题,请参考以下文章

在 swift 中将 String 类型数组转换为 Float 类型数组 不能将类型 'String' 的值分配给类型 'Double' 的下标。

Double 值无法转换为 Int64,因为它要么是无限的要么是 NaN

收到致命错误:双精度值无法转换为 Int,因为它是无限的或 NaN

firebase swift 3 转换:无法将类型“(_)->()”的值转换为预期的参数类型“((错误)-> Void)?

Xcode 8.1 Swift 3 错误:无法将“String”类型的值转换为预期的参数类型“UnsafeMutableRawPointer”

Swift json 解析错误:无法将 NSCFConstantString 类型的值转换为 NSArray