【问题标题】:Generic integer casting in swiftswift中的通用整数转换
【发布时间】:2016-06-15 22:35:41
【问题描述】:

我想转换以下句子:

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 &lt;&lt; rightright 构造或转换为T

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

有什么方法可以用泛型来表达吗?

【问题讨论】:

    标签: swift generics


    【解决方案1】:

    请记住,与Integer 相关的协议将在 Swift 3 中进行重新设计(尽管它们还没有为 Preview 1 做好准备)。

    现在,你不能做你想做的事情,因为IntegerType 没有公开一种从/到其他整数类型转换的方法,就像你尝试对T((1 &lt;&lt; right)) 做的那样。如果您专门研究SignedIntegerTypeUnsignedIntegerType,则可以分别使用T(_: IntMax)T(_: UIntMax) 初始化器来创建整数。

    我的理解是,您的函数会返回是否在整数上设置了位。我在这里无法使用 Swift 编译器,但我认为这会起作用:

    func <*> <T: IntegerType>(left: T, right: T) -> T {
        return left >> right & 1
    }
    

    编辑&lt;&lt;&gt;&gt; 运算符目前不属于任何协议,这将使在泛型中使用它们非常痛苦。上面的例子不起作用。

    【讨论】:

    • 如果我选择UnsignedIntegerType例如我有一个新的错误:Cannot convert value of type 'Int8' to expected argument type 'UInt64'
    • 正如我所写,如果您选择UnsignedIntegerType,您可以访问一个需要UIntMax 值的初始化程序。您需要将 Int8 转换为 UIntMax
    猜你喜欢
    • 1970-01-01
    • 2014-12-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-04
    • 2017-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多