我正在尝试编写一个需要位移操作的通用函数。我得到了我不理解的行为。这是一个演示问题的简单函数。
func testBytes<T: IntegerType>(bytesIn: [UInt8], inout dataOut: T){
let outputSize = sizeof(T)
var temp: T = 0
dataOut = 0
temp = bytesIn[0] as T
temp = temp << 1
}
如果我这样做,那么最后一行在xcode中给出了一个错误“T不能转换为Int”。
我可以将最后一行更改为temp = temp << (1 as T)
然后此行的错误更改为“T无法转换为UInt8”
在这种情况下,这些错误消息中的任何一个都没有意义。我能做些什么来启用泛型类型的位移?
答案 0 :(得分:7)
我有一个更详细的blog post on this topic,但基本上有三个步骤:
使用bitshift运算符和UInt8
中的构造函数创建一个新协议:
protocol BitshiftOperationsType {
func <<(lhs: Self, rhs: Self) -> Self
func >>(lhs: Self, rhs: Self) -> Self
init(_ val: UInt8)
}
声明与每个整数类型的扩展名一致 - 很简单,因为他们已经在BitshiftOperationsType
中实现了所有内容:
extension Int : BitshiftOperationsType {}
extension Int8 : BitshiftOperationsType {}
extension Int16 : BitshiftOperationsType {}
extension Int32 : BitshiftOperationsType {}
extension Int64 : BitshiftOperationsType {}
extension UInt : BitshiftOperationsType {}
extension UInt8 : BitshiftOperationsType {}
extension UInt16 : BitshiftOperationsType {}
extension UInt32 : BitshiftOperationsType {}
extension UInt64 : BitshiftOperationsType {}
添加通用约束,以使T
符合您的新协议:
func testBytes<T: IntegerType where T: BitshiftOperationsType>(bytesIn: [UInt8], inout dataOut: T){
let outputSize = sizeof(T)
var temp: T = 0
dataOut = 0
temp = T(bytesIn[0])
temp = temp << 1
}
感谢Martin R.为我以前在这里获得的总量做了修复!