// 某个Date类型的日期
let date: Date = ...
// 生成BLE设备需要的`UInt32`类型的时间戳
let toPeripheralTimestamp: UInt32 = UInt32(date)
线上出现如下两类CRASH:
- Inline: Swift runtime failure: Double value cannot be converted to UInt32 because the result would be greater than UInt32.max
- Double value cannot be converted to UInt32 because it is either infinite or NaN
UInt32(date)
, 更近一步说是如下初始化方法:/// Creates an integer from the given floating-point value, rounding toward zero.
/// 译: 从给定的浮点值创建一个整数,向零舍入。
/// Any fractional part of the value passed as `source` is removed, rounding the value toward zero. eg: let x = Int(21.7), x = 21
/// 译: 作为 source 传递的值的任何小数部分都将被删除,将值向零取整。eg: let x = Int(21.7), x = 21
public init(_ source: Double)
If
source
is outside the bounds of this type after rounding toward zero, a runtime error may occur.
译: 如果 source 在向零舍入后超出此类型的范围,则可能会发生运行时错误。
// 会提示: Double value cannot be converted to UInt32 because it is either infinite or NaN
a. Double.infinite, Double.nan
// Error: ...the result would be less than UInt.min
b. 负数
// Error: ...result would be greater than UInt32.max
c. 大于 UInt32.max 的浮点数
//
// MIWSafe.swift
// xxxxxxx
//
// Created by 侯仕奇 on 2023/3/8.
// Copyright © 2023 零下引力. All rights reserved.
//import Foundationclass SQISafe {public static func sqiUInt32(_ source: Double) -> UInt32 {guard !source.isNaN else {return UInt32.zero}guard !source.isInfinite else {return UInt32.max}guard source < Double(UInt32.max) else {return UInt32.max}return UInt32(source)}
}
// 某个Date类型的日期
let date: Date = ...
// 生成BLE设备需要的`UInt32`类型的时间戳
let toPeripheralTimestamp: UInt32 = SQISafe.sqiUInt32(date)
/// Positive infinity. 正无穷大。
Double.infinity
/// A quiet NaN ("not a number").
Double.nan
上一篇:图床搭建,使用typora上传