二元运算符' |'不能应用于' Int'类型的操作数和' UInt8'

时间:2015-05-08 11:36:20

标签: swift binary type-conversion unsigned-integer

我希望在2位地图上执行简单的or逻辑,但Swift认为这是错误的:

let u: UInt8 = 0b1
let i: Int = 0b10
i | u // Binary operator '|' cannot be applied to operands of type 'Int' and 'UInit8'

任何符合类型推断的方法仍然有效吗?

我总是可以做i | Int(u) // 3,但我认为这不是最佳的。

1 个答案:

答案 0 :(得分:3)

Swift的一个基本原则是不隐含的 在类型之间转换。

let u: UInt8 = 0b1
let i: Int = 0b10
i | Int(u)

迫使您考虑必要的转化以及结果应具有的类型, 所以正确的解决方案(在我看来)。

让我们考虑另一个例子:

let u: UInt8 = 128
let i: Int8 = -128

u|i应该是什么?两个

u | UInt8(i)
Int8(u) | i

在运行时崩溃,因为u不在Int8范围内,i不在 在UInt8范围内。两者

u | UInt8(bitPattern: i)   // result is `UInt8`
Int8(bitPattern: u) | i    // result is `Int8`

会起作用,但编译器应如何在两者之间做出选择?  可以将两者都转换为更大的类型,例如

Int(u) | Int(i)

但是那种类型有些武断,怎么能从编译器中自动推断出来呢?什么是“更大型” 对于Int64 + UInt64参数?

这就是为什么我认为明确的转换是正确的解决方案。