我希望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'
符合类型推断的任何方法仍然可以正常工作吗?
我总是可以做,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)
但是该类型有些武断,怎么能从编译器中自动推断出来呢?Int64
+UInt64
参数的“较大类型”是什么?
这就是为什么我认为显式转换是正确的解决方案。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句