【问题标题】:Swift bitwise shift operations giving compile-time errorSwift 的按位移位操作会产生编译时错误
【发布时间】:2014-06-06 04:18:50
【问题描述】:

在 Swift 中,位运算符似乎不适用于 UInt64 变量。

class Polyomino {
    var squares : UInt64 = 0
    var xLength : UInt8 = 0
    var yLength : UInt8 = 0

    func addSquareAt(x : UInt8, y : UInt8) {
        squares |= (UInt64(1) << (x + y * 8))
    }
}

按位运算符的行给出错误“使用提供的参数无法为“\=”找到重载”。以下语句也是如此:

squares = squares | (UInt64(1) << (x + y * 8))

我假设这是 Apple 的错误(可能是错误的),但有什么方法可以暂时解决这个问题,还是我应该等待 Apple 修复?还是我做错了什么?

【问题讨论】:

  • 尝试将所有内容投射到UInt64
  • 哇类型的安全性在swift中确实得到了更多的强制执行,呵呵。我需要将位移中的第二部分类型转换为 UInt64。
  • 希望您不介意我编辑您的问题的标题以使其更笼统。 (在我的情况下,我正在使用 UInt32,也许正因为如此,我的搜索没有找到这个问题和答案。所以我正在发布我自己的问题,幸运的是,这个问题显示为“类似问题”。)

标签: swift


【解决方案1】:

Swift 中的类型安全意味着您不能在不同的数字类型之间进行操作。您正在尝试将 UInt8s 转移到不支持的 UInt64。尝试将结果转换为 UInt64

func addSquareAt(x : UInt8, y : UInt8) {
    squares |= 1 << UInt64(x + y * 8)
}

【讨论】:

  • 这不是“类型安全”,这是愚蠢的。按位移位运算符的右侧操作数指定要完成的移位量,因此它的类型是(或应该)完全独立于左侧操作数的类型。 (我一直在努力解决这个问题,当我在“类似问题”下注意到这个问题和答案时,我正在发布一个关于它的问题。)
猜你喜欢
  • 1970-01-01
  • 2011-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-06
  • 1970-01-01
相关资源
最近更新 更多