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

相关内容

热门资讯

安卓系统写脚本软件下载,基于安... 你有没有想过,你的安卓手机或者平板电脑,除了用来刷剧、玩游戏,还能变成一个强大的工作助手呢?没错,就...
安卓系统有哪些机型好,探索顶级... 你有没有想过,安卓系统里的手机型号那么多,哪一款才是最适合你的呢?别急,今天我就来给你好好盘点看看安...
安卓系统之间如何互传,安卓设备... 你是不是也和我一样,手机里存了那么多好东西,却苦于不能和好友分享呢?别急,今天就来教你怎么用安卓系统...
安卓系统启动修改工具,安卓系统... 你有没有想过,你的安卓手机启动速度竟然可以像火箭一样快?没错,这就是今天我要跟你分享的神秘工具——安...
安卓系统版本号历史,从初生到繁... 你有没有发现,每次打开手机,那系统版本号总是一闪而过,好像在悄悄告诉你:“我可是有故事的哦!”今天,...
小米改安卓系统软件,安卓系统软... 你知道吗?最近小米手机界可是掀起了一阵小小的风波呢!那就是小米对安卓系统软件的一次大改版。这可不是什...
安卓系统控制流量app,安卓系... 你有没有发现,手机里的流量就像小河里的水,不知不觉就流光了?别急,今天就来给你揭秘一款神奇的安卓系统...
hl2240安卓系统,功能解析... 你有没有发现,最近你的手机系统更新换代的速度简直就像坐上了火箭呢?今天,就让我带你来一探究竟,看看这...
iqoo刷原生安卓系统,还原纯... 最近手机圈里可是热闹非凡呢!一款名为iqoo的新品手机,凭借其强大的性能和独特的刷机功能,吸引了无数...
安卓系统我的读书入口,我的读书... 亲爱的手机控们,你是否也有这样的体验:每天手机不离手,却总是找不到心仪的读书应用?别急,今天我要给你...
搭载安卓9系统的手机,新一代智... 你有没有发现,最近市面上新出的手机,好像都开始搭载安卓9系统了呢?这可真是让人眼前一亮啊!今天,就让...
电脑模拟安卓系统win7系统,... 你有没有想过,如果电脑也能像手机一样,随时随地都能玩各种游戏、看视频呢?想象你坐在电脑前,屏幕上突然...
华为系统如何退回安卓,轻松实现... 你有没有想过,手机系统就像是我们生活中的衣服,有时候穿久了,就想换一件新的。比如,你之前用了华为的系...
安卓系统定制防沉迷手机,安卓手... 你有没有发现,现在的手机越来越智能,但随之而来的是沉迷于手机的问题也越来越严重,尤其是对青少年来说。...
安卓系统手机顶部符号,功能解析... 你有没有注意到,每次拿起安卓系统手机,顶部那一排小小的符号总是默默守护着你的屏幕?它们就像是一群小精...
美团餐饮系统安卓版,尽享美食新... 你有没有发现,最近点外卖的时候,手机上那个美团餐饮系统安卓版真是越来越方便了!今天,就让我带你来好好...
新生活cms安卓系统进货系统,... 你知道吗?最近市面上出现了一个超级酷的新玩意儿——新生活CMS安卓系统进货系统!这可是个让商家们眼睛...
安卓系统ai文章生成,探索安卓... 你知道吗?现在手机界的风云变幻,安卓系统可是当之无愧的王者!而且,最近听说安卓系统里还悄悄加入了AI...
推荐安卓车载导航系统,安卓平台... 你有没有想过,开车的时候,如果没有导航系统,那可真是像在茫茫大海中航行,没有指南针的感觉呢?别急,今...
安卓系统的地图怎样下载,下载与... 你有没有发现,现在不管去哪里,手机地图都成了我们的好帮手?尤其是安卓系统的地图,功能强大,用起来超级...