快速通用功能中的位移位

时间:2014-11-03 14:50:37

标签: generics swift

我正在尝试编写一个需要位移操作的通用函数。我得到了我不理解的行为。这是一个演示问题的简单函数。

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”

在这种情况下,这些错误消息中的任何一个都没有意义。我能做些什么来启用泛型类型的位移?

1 个答案:

答案 0 :(得分:7)

我有一个更详细的blog post on this topic,但基本上有三个步骤:

  1. 使用bitshift运算符和UInt8中的构造函数创建一个新协议:

    protocol BitshiftOperationsType {
        func <<(lhs: Self, rhs: Self) -> Self
        func >>(lhs: Self, rhs: Self) -> Self
        init(_ val: UInt8)
    }
    
  2. 声明与每个整数类型的扩展名一致 - 很简单,因为他们已经在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 {}
    
  3. 添加通用约束,以使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
    }
    
  4. 感谢Martin R.为我以前在这里获得的总量做了修复!