摘要访问Swift中的按位移位

时间:2016-01-15 10:11:28

标签: swift polymorphism bitwise-operators bit-shift

所以不久前我在Swift中编写了一些代码,这些代码允许我对整数进行一些有用的额外操作,包括获取实际设置的最高位和最低位。

作为一个例子,这里是我添加的基本属性,现在已被破坏:

extension IntegerType {
    var hiBit:Self { return ~self.allZeroes << ((sizeof(Self) * 8) - 1) }
}

现在无法编译,因为IntegerType不再符合BitwiseOperationsType,因此代字号运算符和allZeroes属性不再可用。同样地,对于实现IntegerTypeBitwiseOperationsType的结构体似乎没有任何要求具有移位运算符,它们似乎现在只是按惯例定义,除非我错过了某些内容。这意味着我无法将我的代码移植到BitwiseOperationsType,即使它看起来更合乎逻辑。

所以我的问题是;我在哪里实现最高级别的代码?我不想为每个特定的整数类型复制它,这就是我将IntegerType扩展为开头的原因。

另外,我最初将hiBit实现为static属性,但这些属性似乎不再受支持,这很明显,因为它们很明显,并且错误消息暗示它们将会将来,建议他们从规范中撤出;但我没有运行Xcode测试版。

1 个答案:

答案 0 :(得分:1)

没有定义位移运算符的协议,所以你有 定义你自己的:

protocol ShiftOperationsType : BitwiseOperationsType {
    func <<(lhs: Self, rhs: Self) -> Self
    func >>(lhs: Self, rhs: Self) -> Self
    init(_ value : Int)
}

不幸的是,您必须声明整数类型的一致性 明确针对每种类型的协议(目前没有 更简单的解决方案,比较What protocol should be adopted by a Type for a generic function to take any number type as an argument in Swift?)。

extension Int : ShiftOperationsType {}
extension Int8 : ShiftOperationsType {}
extension Int16 : ShiftOperationsType {}
extension Int32: ShiftOperationsType {}
extension Int64: ShiftOperationsType {}
extension UInt : ShiftOperationsType {}
extension UInt8 : ShiftOperationsType {}
extension UInt16 : ShiftOperationsType {}
extension UInt32 : ShiftOperationsType {}
extension UInt64 : ShiftOperationsType {}

但是,您可以将hiBit定义为通用静态属性:

extension ShiftOperationsType {
    static var hiBit : Self {
        return (~allZeros) << Self(sizeof(Self) * 8 - 1)
    }
}

协议中的init方法是必要的,因为sizeof() 返回Int,必须转换为Self