swift - swift 中的通用整数转换

标签 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 << rightrightT :

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)) 所做的那样.如果你专门研究 SignedIntegerTypeUnsignedIntegerType相反,您将能够使用 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/

相关文章:

ios - 如何为 CALayer 设置委托(delegate)?

C#语法糖重载

即使参数为零,也需要 Swift 可选泛型类型

c# - 参数类型不可分配给参数类型,它应该是

ios - 展开可选值(由 data.withUnsafeBytes(_ :)) sometimes does not work with guard let 返回

ios - Swift 泛型变量

swift - 使用函数式编程提取数组中的对象

swift - Xcode 9 自定义模板如何改变?

xcode - 非泛型 Swift 类可以实现 UIPickerViewDataSource 但泛型版本不能

java - 将对象转换为 <T> 类型