簡體   English   中英

快速通用泛型轉換

[英]Generic integer casting in swift

我想轉換以下句子:

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 << rightT right

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

有什么方法可以使用泛型來表達這一點嗎?

請記住,與Integer相關的協議將在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
}

編輯<<>>運算符當前不屬於任何協議的一部分,這會使在泛型中使用它們非常痛苦。 上面的示例不起作用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM