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,但我认为这并不是最佳选择。
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不在 an 的范围内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?
这就是为什么我认为显式转换是正确的解决方案。