首页 > 解决方案 > 双精度字符串格式崩溃

问题描述

我们在下面的 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

解决方案


您可以使用 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()

推荐阅读