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:使用不同整数大小时出错的主要内容,如果未能解决你的问题,请参考以下文章
使用 Alamofire 搜索从 swift 2 转换为 swift 3 时出错