[英]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 << right
或T
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))
那樣提供從其他整數類型轉換為其他類型的方法。 如果您專門研究SignedIntegerType
和UnsignedIntegerType
,則可以分別使用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.