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

Max*_*ler 4 binary type-conversion unsigned-integer swift

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

let u: UInt8 = 0b1
let i: Int = 0b10
i | u // Binary operator '|' cannot be applied to operands of type 'Int' and 'UInit8'
Run Code Online (Sandbox Code Playgroud)

有什么方法可以符合类型推断并且仍然有效吗?

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

Mar*_*n R 5

Swift 的基本原则之一是它不会在类型之间隐式转换。

let u: UInt8 = 0b1
let i: Int = 0b10
i | Int(u)
Run Code Online (Sandbox Code Playgroud)

迫使您考虑必要的转换以及结果应该具有什么类型,因此这正确的解决方案(在我看来)。

让我们考虑另一个例子:

let u: UInt8 = 128
let i: Int8 = -128
Run Code Online (Sandbox Code Playgroud)

应该是什么u|i?两个都

u | UInt8(i)
Int8(u) | i
Run Code Online (Sandbox Code Playgroud)

运行时崩溃,因为u不在 an 的范围内Int8,并且i不在 a​​n 的范围内UInt8。两个都

u | UInt8(bitPattern: i)   // result is `UInt8`
Int8(bitPattern: u) | i    // result is `Int8`
Run Code Online (Sandbox Code Playgroud)

可以,但是编译器应该如何在两者之间进行选择?例如,我们可以将两者转换为某种更大的类型

Int(u) | Int(i)
Run Code Online (Sandbox Code Playgroud)

但该类型有点任意,如何从编译器自动推断出它?Int64+参数的“更大类型”是什么UInt64

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