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

标签 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)

最佳答案

作为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/

相关文章:

objective-c - 在两个 View 上显示来自点击计数器的文本

ios - 如何在核心数据中保存图像的引用(图像 URL 或路径)并在需要时加载?

ios - 为分组 TableView 填充 cellForRowAtIndexPath

ios - 使用Swift3将图像从服务器加载到iOS10中Apple Map中的AnnotationView

firebase - 将应用程序提交到使用 Firebase 的 App Store

Swift 类型(:) function signature

objective-c - 通过 FTP 连接删除服务器上的文件夹

java - 如何使用 Selenium 在 iPhone 中执行 ENTER 键操作

swift - 既然 Swift 已经弃用了 macOS 中的 initialize() ,是否有替代方案?

ios - 明确告知计时器后,计时器未启动