加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

为什么将Double转换为Int不会在Swift中返回可选的Int?

发布时间:2020-12-14 04:34:10 所属栏目:百科 来源:网络整理
导读:将String转换为Int会返回可选值,但将Double转换为Int不会返回可选值.这是为什么?我想检查double值是否大于最大Int值,但因为转换函数没有返回可选值,我无法使用可选绑定进行检查. var stringNumber: String = "555"var intValue = Int(stringNumber) // retu
将String转换为Int会返回可选值,但将Double转换为Int不会返回可选值.这是为什么?我想检查double值是否大于最大Int值,但因为转换函数没有返回可选值,我无法使用可选绑定进行检查.

var stringNumber: String = "555"
var intValue = Int(stringNumber) // returns optional(555)

var doubleNumber: Double = 555
var fromDoubleToInt = Int(doubleNumber) // returns 555

因此,如果我尝试转换大于最大整数的双数,它会崩溃而不是返回nil.

var doubleNumber: Double = 55555555555555555555
var fromDoubleToInt = Int(doubleNumber) // Crashes here

我知道还有另一种方法来检查双数是否大于最大整数值,但我很好奇为什么它会以这种方式发生.

解决方法

如果我们考虑到大多数双打,转换为Int只是意味着删除小数部分:

let pieInt = Int(3.14159) // 3

然后,Int(Double)构造函数返回nil的唯一情况是溢出的情况.

对于字符串,转换为Int会返回一个可选的,因为通常是字符串,例如“Hello world!”不能以普遍有意义的方式表示为Int.因此,在字符串不能表示为整数的情况下,我们返回nil.顺便说一下,这包括可以完美表示为双精度或浮点数的值:

考虑:

let iPi = Int("3.14159")
let dPi = Double("3.14159")

在这种情况下,iPi为零,而dPi为3.14159.为什么?因为“3.14159”没有有效的Int表示.

但同时,当我们使用带有Double并返回非可选的Int构造函数时,我们得到一个值.

那么,如果改变了那个构造函数以返回一个可选项,为什么它会为3.14159而不是nil返回3? 3.14159不能表示为整数.

但是如果你想要一个返回可选Int的方法,当Double溢出时返回nil,你就可以编写该方法.

extension Double {
    func toInt() -> Int? {
        let minInt = Double(Int.min)
        let maxInt = Double(Int.max)

        guard case minInt ... maxInt = self else {
            return nil
        }

        return Int(self)
    }
}

let a = 3.14159.toInt() // returns 3
let b = 555555555555555555555.5.toInt() // returns nil

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读