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

Binary operator '|' cannot be applied to operands of type 'Int' and 'UInt8'

我希望在 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,但我认为这不是最佳选择。

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)

但是那个类型有点随意,它怎么能从编译器自动推断出来呢?什么是 "larger type" 对于 Int64 + UInt64 个参数?

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