Double扩展formatTrackTime属性Getter方法字符串格式化崩溃排查求助
代码崩溃隐患分析
你提供的Double扩展代码存在2个明确会触发崩溃的问题:
- 未处理无穷值场景:当前仅判断了非NaN的逻辑,
Double.infinity(正无穷)、-Double.infinity(负无穷)的isNaN属性为false,会进入正常计算分支,对无穷值做算术运算后转换为Int会直接触发溢出崩溃。 - 未限制数值范围:如果Double的数值超出当前平台Int的可表示范围(比如32位平台Int最大值为2147483647,对应秒数约为68年),执行
Int()转换时会直接触发崩溃,常见于业务层返回异常超大时长的场景。
修复后的代码
优化逻辑后可覆盖所有异常场景,同时简化了计算逻辑:
extension Double { public var formatTrackTime: String { // 提前过滤所有异常值:非数字、无穷值、负数、超出Int可承载范围的超大值 guard !self.isNaN, !self.isInfinite, self >= 0, self <= Double(Int.max) else { return "0:00" } let totalSeconds = Int(self) let hour = totalSeconds / 3600 let minute = (totalSeconds % 3600) / 60 let second = totalSeconds % 60 return hour > 0 ? String(format: "%d:%02d:%02d", hour, minute, second) : String(format: "%02d:%02d", minute, second) } }
内容的提问来源于stack exchange,提问作者Jake
相关产品推荐
相关产品推荐

