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

时间:2017-07-31 08:05:52

标签: ios swift swift3

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

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)

2 个答案:

答案 0 :(得分:2)

使用FixedWidthInteger代替UnsignedInteger

UnsignedInteger运算符没有<<重载:

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

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

答案 1 :(得分:2)

作为Tomasz Wójcik already said,左移 运算符在Swift 3中仅为具体整数类型定义, 但不适用于SELECT TOP 10 'IF NOT EXISTS(SELECT 1 FROM tblParameterKey WHERE keyNames=''' + CAST(ISNULL([keyNames], 'NULL') AS NVARCHAR(255)) + ''') BEGIN INSERT INTO tblParameterKey VALUES(''' + CAST(ISNULL([keyNames], 'NULL') AS NVARCHAR(255))+''') END' FROM tblParameterKey 协议。

可能的解决方法 是通过重复乘法来替换左移:

UnsignedInteger

这也使强迫演员func doubleHexMask<T: UnsignedInteger>(offset: Int) -> T { var mask: T = 0xFF for _ in 0..<offset { mask = mask &* 16 } return mask } 变得不必要。该 使用"overflow operator &*" 这样就可以丢弃超出整数存储边界的位,这与左移位运算符的作用相对应。