我想改造以下句子:
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)
有什么方法可以用泛型来表达吗?
最佳答案
请记住 Integer
- 相关协议(protocol)将在 Swift 3 中重新设计(尽管它们还没有为 Preview 1 做好准备)。
现在,你不能做你想做的事,因为IntegerType
没有公开一种从其他整数类型转换为其他整数类型的方法,正如您尝试使用 T((1 << right))
所做的那样.如果你专门研究 SignedIntegerType
和 UnsignedIntegerType
相反,您将能够使用 T(_: IntMax)
和 T(_: UIntMax)
初始化器,分别创建整数。
我的理解是,您的函数返回某个位是否设置为整数。我在这里无法访问 Swift 编译器,但我认为这可行:
func <*> <T: IntegerType>(left: T, right: T) -> T {
return left >> right & 1
}
编辑:<<
和 >>
运算符目前不是任何协议(protocol)的一部分,这将使在泛型中使用它们变得非常痛苦。上面的例子是行不通的。
关于swift - swift 中的通用整数转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37846941/