我想创建一个通用函数,它可以创建位掩码以供将来使用。这是我的代码:
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 already said , 左移
运算符在 Swift 3 中仅为具体整数类型定义,
但不适用于 UnsignedInteger
协议(protocol)。
可能的解决方法 就是用重复的乘法代替左移:
func doubleHexMask<T: UnsignedInteger>(offset: Int) -> T {
var mask: T = 0xFF
for _ in 0..<offset {
mask = mask &* 16
}
return mask
}
这也使得强制转换 as! T
不必要。这
"overflow operator &*
"用来
在这里,移动到整数存储范围之外的位将被丢弃,对应于左移运算符的作用。
关于ios - 二元运算符 '<<' 不能应用于两个 'T' 操作数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45410418/