代码之家  ›  专栏  ›  技术社区  ›  Haravikk

Swift中位移位的抽象访问

  •  0
  • Haravikk  · 技术社区  · 9 年前

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

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

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

    现在无法编译,因为 IntegerType 不再符合 BitwiseOperationsType 所以波浪号操作符和 allZeroes 属性不再对其可用。同样,似乎不再需要结构实现 整数类型 按位操作类型 要有轮班操作符,它们现在似乎是按照惯例定义的,除非我遗漏了什么。这意味着我无法将代码移植到 按位操作类型 不管是哪一种,尽管它看起来更符合逻辑。

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

    另外,我最初实现了 hiBit 作为一个 static 属性,但这些似乎不再受支持,这显然很奇怪,错误消息意味着它们将来会被支持,表明它们已从规范中删除;但我没有运行Xcode测试版。

    1 回复  |  直到 9 年前
        1
  •  1
  •   Community CDub    8 年前

    没有定义位移位运算符的协议,因此 定义自己的:

    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 .