二元运算符"<<"不能应用于两个"T"操作数



我想创建一个通用函数,它可以创建位掩码以供将来使用。这是我的代码:

import Foundation
class BitParserUtils {
static let hexPositionOffset: Int = 4
static func doubleHexMask<T: UnsignedInteger>(offset: Int) -> T {
var mask: T = 0xFF
mask = mask << ((offset * hexPositionOffset) as! T)
return mask
}
}

但是我得到了一个调试错误:

Binary operator '<<' cannot be applied to two 'T' operands

我不明白为什么以及如何解决这个问题。任何人都可以解释我做错了什么以及如何解决?

使用示例

let maskU64: UInt64 = BitParserUtils.doubleHexMask(offset: 4)
let maskU32: UInt32 = BitParserUtils.doubleHexMask(offset: 1)
let maskU16: UInt16 = BitParserUtils.doubleHexMask(offset: 0)

正如Tomasz Wójcik已经说过的那样,左移 运算符在 Swift 3 中仅为具体整数类型定义, 但不适用于UnsignedInteger协议。

可能的解决方法 是用重复乘法代替左移:

func doubleHexMask<T: UnsignedInteger>(offset: Int) -> T {
var mask: T = 0xFF
for _ in 0..<offset {
mask = mask &* 16
}
return mask
}

这也使得强制投as! T没有必要。这 使用"溢出运算符&*" 在这里,移出整数存储边界的位将被丢弃,对应于左移运算符所做的。

使用FixedWidthInteger而不是UnsignedInteger

操作员<<没有UnsignedInteger过载:

http://swiftdoc.org/v3.1/operator/ltlt/

注意:这需要 Xcode 9 (Swift 3.2/4.0(

相关内容

最新更新