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)
【问题讨论】:
考虑使用TimeInterval
和DateComponentsFormatter
怎么调用函数,出现问题时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
是一个很好的解决方案,它可以为您完成整个功能的工作(请记住,创建 DateFormatter
s 的成本有点高,所以您不想创建为您所做的每种字符串格式设置一个,但如果有意义,请保留它)
【讨论】:
以上是关于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”