Swift 中对位移位的抽象访问
Abstract Access to Bitwise Shifts in Swift
不久前,我正在编写 Swift 中的一些代码,这些代码允许我对二进制整数进行一些有用的额外操作,包括获取实际设置的最高位和最低位。
例如,这是我添加的基本 属性 现在已损坏:
extension IntegerType {
var hiBit:Self { return ~self.allZeroes << ((sizeof(Self) * 8) - 1) }
}
现在无法编译,因为 IntegerType
不再符合 BitwiseOperationsType
,因此波浪号运算符和 allZeroes
属性不再可用。同样,实现 IntegerType
或 BitwiseOperationsType
的结构似乎不再需要具有移位运算符,它们现在似乎只是按照约定定义的,除非我错过了什么。这意味着我也无法将我的代码移植到 BitwiseOperationsType
,即使它看起来更合乎逻辑。
所以我的问题是;我在哪里实现我的最高级别的代码?我不想为每个特定的整数类型都复制它,这就是为什么我开始扩展 IntegerType
的原因。
另外,我最初将 hiBit
实现为 static
属性,但这些似乎不再受支持,这显然很奇怪,而且错误消息暗示它们将在未来出现,表明它们已从规范中撤出;但我不是 运行 Xcode 测试版。
没有定义位移运算符的协议,所以你有
定义你自己的:
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()
returns 一个 Int
并且必须转换为 Self
.
不久前,我正在编写 Swift 中的一些代码,这些代码允许我对二进制整数进行一些有用的额外操作,包括获取实际设置的最高位和最低位。
例如,这是我添加的基本 属性 现在已损坏:
extension IntegerType {
var hiBit:Self { return ~self.allZeroes << ((sizeof(Self) * 8) - 1) }
}
现在无法编译,因为 IntegerType
不再符合 BitwiseOperationsType
,因此波浪号运算符和 allZeroes
属性不再可用。同样,实现 IntegerType
或 BitwiseOperationsType
的结构似乎不再需要具有移位运算符,它们现在似乎只是按照约定定义的,除非我错过了什么。这意味着我也无法将我的代码移植到 BitwiseOperationsType
,即使它看起来更合乎逻辑。
所以我的问题是;我在哪里实现我的最高级别的代码?我不想为每个特定的整数类型都复制它,这就是为什么我开始扩展 IntegerType
的原因。
另外,我最初将 hiBit
实现为 static
属性,但这些似乎不再受支持,这显然很奇怪,而且错误消息暗示它们将在未来出现,表明它们已从规范中撤出;但我不是 运行 Xcode 测试版。
没有定义位移运算符的协议,所以你有 定义你自己的:
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()
returns 一个 Int
并且必须转换为 Self
.