二元运算符“|”不能应用于 '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
个参数?
这就是为什么我认为显式转换是正确的解决方案。
我希望在 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
个参数?
这就是为什么我认为显式转换是正确的解决方案。