我想改造以下句子:
infix operator <*> {}
public func <*> (left: Int64, right: Int16) -> UInt8 {
return UInt8( (left & Int64((1 << right))) >> Int64(right) )
}
public func <*> (left: Int32, right: Int16) -> UInt8 {
return UInt8( (left & Int32((1 << right))) >> Int32(right) )
}
只有一个类似于:
的通用函数public func <*> <T: IntegerType>(left: T, right: Int8) -> Bit {
return UInt8( (left & T((1 << right))) >> T(right) )
}
问题在于我无法将1 << right
或right
构建或投射到T
:
Overloads for 'T' exist with these partially matching parameter lists: (integerLiteral: Self.IntegerLiteralType), (_builtinIntegerLiteral: _MaxBuiltinIntegerType)
有没有办法用泛型来表达这个?
答案 0 :(得分:0)
请记住,Integer
相关协议将在Swift 3中重新编写(尽管它们还没有为预览1做好准备)。
现在,你无法做你想做的事情,因为IntegerType
没有公开转换/转换到其他整数类型的方法,正如你试图用{{1}做的那样}。如果您专门使用T((1 << right))
和SignedIntegerType
,则可以分别使用UnsignedIntegerType
和T(_: IntMax)
初始值设定项来创建整数。
我的理解是你的函数返回是否在整数上设置了一个位。我在这里无法访问Swift编译器,但我认为这样可行:
T(_: UIntMax)
编辑:func <*> <T: IntegerType>(left: T, right: T) -> T {
return left >> right & 1
}
和<<
运算符目前不属于任何协议,这使得在泛型中使用它们非常痛苦。上面的例子不起作用。