swift - 双精度字符串格式崩溃
问题描述
我们在下面的 getter 方法中发生了崩溃,但无法查看崩溃可能发生的位置。
extension Double {
public var formatTrackTime: String {
if !self.isNaN {
let hour = Int(self / 3600)
let minute = Int(self.truncatingRemainder(dividingBy: 3600) / 60)
let second = Int(self.truncatingRemainder(dividingBy: 60))
return hour > 0 ? String(format: "%d:%02d:%02d", hour, minute, second) : String(format: "%02d:%02d", minute, second)
} else {
return "0:00"
}
}
}
崩溃日志仅将我们指向这个 getter,但没有提供有关崩溃的其他详细信息。这里有什么突出的崩溃吗?
解决方案
您可以使用 Swift 的“现成”东西来完成此任务,而无需进行大量数学运算。
extension Double {
var formatTrackTime: String? {
guard !isInfinite else {
return nil
}
let formatter = DateComponentsFormatter()
formatter.allowedUnits = [.hour, .minute, .second]
formatter.unitsStyle = .positional
return formatter.string(from: self)
}
}
游乐场的一些测试代码:
// 3:36:40
print(13000.formatTrackTime)
// "\n" (empty string)
print(Double.infinity.formatTrackTime)
class DoubleTests: XCTestCase {
func testFormatTrackTime() {
XCTAssertNil(Double.infinity.formatTrackTime)
XCTAssertEqual(13000.formatTrackTime, "3:36:40")
}
}
DoubleTests.defaultTestSuite.run()
推荐阅读
- arrays - 使用存储在本地存储中的 ID 多次调用电影数据库
- javascript - Stripe 不会将 stripeToken 传递给 Django 后端
- node.js - Discord bot 在 Node.js 中不加载或出错
- react-bootstrap - React JS引导按钮的高度和宽度限制
- reactjs - 硬刷新每次在 React 应用程序中检查授权
- node.js - 从 /api 和 auth/ 路由隐藏 JSON 有效负载
- r - 遇到一个ggplot2的问题。pic1好,然后pic2好,但是当审查pic1时,它变得很糟糕
- javascript - 未捕获(承诺)DOMException:无法启动视频源,未捕获错误:您提供的错误不包含堆栈跟踪
- css - 这些 css 片段中哪一个性能更高,为什么?
- micronaut - Micronaut 数据分页全文搜索查询