我希望在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
,但我认为这不是最佳的。
答案 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
参数?
这就是为什么我认为明确的转换是正确的解决方案。