我正在尝试编写一个需要位移操作的通用函数.我得到了我不理解的行为.这是一个演示问题的简单函数.
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为T) 然后此行的错误更改为“T不可转换为UInt8” 在这种情况下,这些错误消息中的任何一个都不会对我有意义.我可以做些什么来启用泛型类型的位移?
解决方法
我有一个更详细的
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.为我之前在这里获得的总量做了修复!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。