Swift:使用不同整数大小时出错

Posted

技术标签:

【中文标题】Swift:使用不同整数大小时出错【英文标题】:Swift: Errors when using different integer sizes 【发布时间】:2014-06-04 22:00:02 【问题描述】:

我一直在尝试 Swift,因为这显然是 Apple 希望我们进入的方向。 但是,我真的很生气,因为您似乎无法添加不同大小的整数:

    var a: Int64 = 1500
    var b: Int32 = 12349

    var c = a + b
    if a < b  ... 

产生的错误是“找不到接受所提供参数的 '+' 的重载”——显然因为它们是对象类型。类方法似乎对整数的上/下转换没有任何帮助。

同样的情况也适用于任何类型别名,显然 (CInt + CLong)。

我可以看到很多现实世界的情况,其中能够进行整数运算非常实用,更不用说对两个不同大小的整数进行比较或按位运算了。

如何解决这个问题? as 运算符的显式转换似乎不起作用。 Swift 语言书也没有太大帮助,因为它并没有真正讨论这种情况。

【问题讨论】:

var c = Int(a) + Int(b) 【参考方案1】:

Swift 语言书在“数值类型转换”一章中确实讨论了这种情况:

let twoThousand: UInt16 = 2_000
let one: UInt8 = 1
let twoThousandAndOne = twoThousand + UInt16(one)

因为现在加法的两边都是 UInt16 类型,所以允许加法。输出常量 (twoThousandAndOne) 被推断为 UInt16 类型,因为它是两个 UInt16 值的总和。

【讨论】:

好的。我一定错过了——谢谢!似乎要经历很多麻烦。人们将习惯于以这种方式皈依,所以他们无论如何都不会考虑它。我想不出另一种语言需要显式转换整数值才能完成有用的事情。应该是一个警告。不过,谢谢! Go 有同样的限制。它避免了许多很少发生但在发生时很难调试的错误(通常在现场)。这就是为什么明确建议您尽可能只使用Int 我想除非您需要进行 64 位计算?我假设 Int 映射到 C-Int,它在 Mac/ios 风格的 LP64 机制中是 32 位的,在这种情况下,你会变得冗长。我可以看到它有助于解决溢出错误,但这是我希望一种语言应该为我处理的事情,即如果我没有明确指定一个整数大小,则通过强制转换为必要的整数大小......你仍然可以在 Swift 中做到这一点。这有点混搭 “我想不出另一种语言需要显式转换整数值才能完成有用的事情。”您似乎并不了解许多严格静态类型的函数式语言。 Swift 中的数字类型实际上很简单:直接转换为你想要操作的任何类型并使用适当的运算符。如果您想要类似 C/C++/Objective C 的行为,请使用 &+,如果您知道不会出现上溢/下溢错误,请使用 +。去学习 Haskell,然后你会发现 Swift 数字类型转换几乎是平淡无奇的。【参考方案2】:
let a: Int64 = 1500
let b: Int32 = 12349
let c = a + Int64(b)
println("The value of c is \(c)")

【讨论】:

以上是关于Swift:使用不同整数大小时出错的主要内容,如果未能解决你的问题,请参考以下文章

尝试在 Swift 中创建圆形 UIView 时出错

Swift基础学习数据类型

在 swift 中使用 valueForKey 时出错

使用 Alamofire 搜索从 swift 2 转换为 swift 3 时出错

在 swift 4.0 中使用 Alamofire/SwiftyJSON 时出错

使用 Swift 将数据上传到 Firestore 时出错