swift中的通用整数转换

时间:2016-06-15 22:35:41

标签: swift generics

我想改造以下句子:

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 << rightright构建或投射到T

Overloads for 'T' exist with these partially matching parameter lists: (integerLiteral: Self.IntegerLiteralType), (_builtinIntegerLiteral: _MaxBuiltinIntegerType)

有没有办法用泛型来表达这个?

1 个答案:

答案 0 :(得分:0)

请记住,Integer相关协议将在Swift 3中重新编写(尽管它们还没有为预览1做好准备)。

现在,你无法做你想做的事情,因为IntegerType没有公开转换/转换到其他整数类型的方法,正如你试图用{{1}做的那样}。如果您专门使用T((1 << right))SignedIntegerType,则可以分别使用UnsignedIntegerTypeT(_: IntMax)初始值设定项来创建整数。

我的理解是你的函数返回是否在整数上设置了一个位。我在这里无法访问Swift编译器,但我认为这样可行:

T(_: UIntMax)

编辑func <*> <T: IntegerType>(left: T, right: T) -> T { return left >> right & 1 } <<运算符目前不属于任何协议,这使得在泛型中使用它们非常痛苦。上面的例子不起作用。