Swift中的Double转UInt32发生CRASH
创始人
2024-05-30 15:38:26
0次

Phenomenon 现象

// 某个Date类型的日期
let date: Date = ...
// 生成BLE设备需要的`UInt32`类型的时间戳
let toPeripheralTimestamp: UInt32 = UInt32(date)

线上出现如下两类CRASH:

  1. Inline: Swift runtime failure: Double value cannot be converted to UInt32 because the result would be greater than UInt32.max
  2. Double value cannot be converted to UInt32 because it is either infinite or NaN

Analysis 分析

  1. 发生CRASH的确切位置是 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)
  1. 为什么会CRASH ? 官方解释如下:

If source is outside the bounds of this type after rounding toward zero, a runtime error may occur.
译: 如果 source 在向零舍入后超出此类型的范围,则可能会发生运行时错误。

  1. 当 source 为 Double 类型时, 有如下几种超出类型范围的 CRASH 可能:
// 会提示: 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 的浮点数

Solution 解决方法

//
//  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)}
}

Instruction 怎样使用 ?

// 某个Date类型的日期
let date: Date = ...
// 生成BLE设备需要的`UInt32`类型的时间戳
let toPeripheralTimestamp: UInt32 = SQISafe.sqiUInt32(date)

Others

/// Positive infinity. 正无穷大。
Double.infinity
/// A quiet NaN ("not a number").
Double.nan

相关内容

热门资讯

玩家终于实锤了!粤麻圈麻将有挂... 你好粤麻圈麻将这个游戏其实有挂的,确实是有挂的,需要了解【请加QQ群客服咨询:1075075785】...
玩家终于实锤了!美酒之城有挂吗... 玩家终于实锤了!美酒之城有挂吗(分享技巧)原来是有挂的(已更新)(今日头条)1、让任何用户在无需AI...
玩家终于实锤了!凯撒皇宫有挂吗... 自定义凯撒皇宫系统规律,只需要输入自己想要的开挂功能,一键便可以生成出微扑克专用辅助器,不管你是想分...
玩家终于实锤了!福建十三道有挂... 您好,福建十三道这款游戏可以开挂的,确实是有挂的,需要了解{请加QQ群客服咨询:1075075785...
玩家终于实锤了!川南麻将有挂吗... 亲,川南麻将这款游戏可以开挂的,确实是有挂的,。但是开挂要下载第三方辅助软件,川南麻将的开挂软件,名...
玩家终于实锤了!嘉邻游戏有挂吗... 玩家终于实锤了!嘉邻游戏有挂吗(分享技巧)原来是有挂的(已更新)(今日头条)是一款可以让一直输的玩家...
玩家终于实锤了!同城游牛鬼有挂... 玩家终于实锤了!同城游牛鬼有挂吗(分享技巧)原来是有挂的(已更新)(今日头条)是一款可以让一直输的玩...
玩家终于实锤了!打两圈麻将有挂... 您好,打两圈麻将这款游戏可以开挂的,确实是有挂的,需要了解{请加QQ群客服咨询:1075075785...
玩家终于实锤了!歪歪有挂吗(分... 玩家终于实锤了!歪歪有挂吗(分享技巧)原来是有挂的(已更新)(今日头条)是一款可以让一直输的玩家,快...
玩家终于实锤了!微乐云南麻将有... 你好微乐云南麻将这个游戏其实有挂的,确实是有挂的,需要了解【请加QQ群客服咨询:1075075785...
玩家终于实锤了!开心联盟有挂吗... 玩家终于实锤了!开心联盟有挂吗(分享技巧)原来是有挂的(已更新)(今日头条)是一款可以让一直输的玩家...
玩家终于实锤了!聚兴茶馆有挂吗... 亲,聚兴茶馆这款游戏可以开挂的,确实是有挂的,。但是开挂要下载第三方辅助软件,聚兴茶馆的开挂软件,名...
玩家终于实锤了!土豪赢三张有挂... 你好土豪赢三张这个游戏其实有挂的,确实是有挂的,需要了解【请加QQ群客服咨询:1075075785】...
玩家终于实锤了!乐太坊有挂吗(... 玩家终于实锤了!乐太坊有挂吗(分享技巧)原来是有挂的(已更新)(今日头条)1、让任何用户在无需AI插...
玩家终于实锤了!秋水佳人有挂吗... 你好秋水佳人这个游戏其实有挂的,确实是有挂的,需要了解【请加QQ群客服咨询:1075075785】,...
玩家终于实锤了!桦南麻将有挂吗... 您好,桦南麻将这款游戏可以开挂的,确实是有挂的,需要了解{请加QQ群客服咨询:1075075785}...
玩家终于实锤了!聚友联盟有挂吗... 您好:聚友联盟确实真的有挂,软件请加QQ群客服咨询:1075075785确实是有挂的,很多玩家在这款...
玩家终于实锤了!哈狗游戏有挂吗... 你好哈狗游戏这个游戏其实有挂的,确实是有挂的,需要了解【请加QQ群客服咨询:1075075785】,...
玩家终于实锤了!乐宝棋牌有挂吗... 自定义乐宝棋牌系统规律,只需要输入自己想要的开挂功能,一键便可以生成出微扑克专用辅助器,不管你是想分...
玩家终于实锤了!老胡吧有挂吗(... 亲,老胡吧这款游戏可以开挂的,确实是有挂的,。但是开挂要下载第三方辅助软件,老胡吧的开挂软件,名称叫...