Swift中可变位的移位行为

Swift中可变位的移位行为,swift,language-design,bit-shift,Swift,Language Design,Bit Shift,当我尝试在我的计算机上移位位时,我注意到我无法移位可变数量的位 Swift手册仅说明将数字向左/向右移动 “按位左移运算符根据下面定义的规则将数字中的所有位向左或向右移动一定数量的位置。” 是否有意只移动预定义的位数 // Works fine: let shiftMe: UInt32 = 0xFF0000 let shiftedConst = shiftMe >> 16 // Doesn't work: let shiftMe: UInt32 = 0xFF0000 let sh

当我尝试在我的计算机上移位位时,我注意到我无法移位可变数量的位

Swift手册仅说明将数字向左/向右移动

“按位左移运算符根据下面定义的规则将数字中的所有位向左或向右移动一定数量的位置。”

是否有意只移动预定义的位数

// Works fine:
let shiftMe: UInt32 = 0xFF0000
let shiftedConst = shiftMe >> 16

// Doesn't work: 
let shiftMe: UInt32 = 0xFF0000
let shiftValue:Int = 16
let shiftedConst = shiftMe >> shiftValue
第二个示例将不编译并抛出此错误:

找不到接受提供的参数的“>>”的重载


swift是这样设计的吗?它是一个bug并且在beta3中修复了吗?我仍然在beta2 atm上。

移位计数的类型必须与被移位的值的类型匹配

shiftValue必须声明为UInt32

在我看来,如果移位计数类型是UInt8、UInt16、uInt32或uInt64,或者甚至是有符号的版本,则不会有任何区别,因为移位范围小于这些类型中的任何一种。此外,这是一个不必要的绊脚石,既没有记录也没有直观性

错误消息既没有帮助又不正确:

错误::39:20:错误:“UInt32”不能转换为“UInt8”
设shiftedConst=shiftMe>>shiftValue

这些是Swift中的重载运算符基本上†对于运算符>>,正如您所看到的,在具有Int的UInt32上没有这样的运算符重载:

>运营商>

您可以根据自己的意愿随时重载此操作符,如

func >>(lhs: UInt32, rhs: Int) -> UInt32 {
    return lhs >> UInt32(rhs);
}
您的第二个代码片段在将来将不会出现任何问题:

let shiftMe: UInt32 = 0xFF0000
let shiftValue: Int = 16
let shiftedConst = shiftMe >> shiftValue
您将在此处找到有关自定义的更多信息


†在Xcode6 beta、beta2、beta3中,只需简单地展示示例,虽然运算符可以重载,但您可以检查UInt32中是否存在带Int的>>运算符重载,该运算符在相同类型之间重载,目前仅定义了11个整数类型。我正考虑向Apple提交一份错误报告,因为它是很烦人的是,您必须将移位转换为与被移位的数字相同的类型。@JeremyP,这不是一个错误,但运算符不仅超载。如果您觉得缺少任何东西,您可以自己做。@holex这应该报告给苹果,这是Beta软件的重点,以从大型n测试人员的数量。这会使编写代码更加困难,错误消息不正确且没有帮助。@holex我们同意>>的重载运算符只允许两侧使用相同的类型。我们认为这是错误的。如果右侧可以是Int,则运算符将更易于使用,也更自然,例如for i in0..>i}不用难看的类型转换就可以完成。我已经提出了17746645。如果其他任何人想看到重载更改或至少是更好的错误消息,我建议他们也提出一个错误。简单地说:你在哪里找到了这些信息。我怎么找到它。@Zaph,非常简单:选择任何快速类型+右键单击+跳转到定义+滚动文件顶部对于那些运营商来说,大概是第880行。小菜一碟。我认为这对一个开发者来说根本不是一个问题……我的错,对不起。
let shiftMe: UInt32 = 0xFF0000
let shiftValue: Int = 16
let shiftedConst = shiftMe >> shiftValue