在Swift 2.1中重载Bitwise NOT运算符

时间:2016-01-17 21:31:04

标签: swift

我在swift中写了一个简单的枚举,类似于:

enum Bit: UInt8 {
    case Zero = 0b0000_0000
    case One  = 0b0000_0001
}

除此之外,我还编写了一些按位运算符重载,除NOT运算符外,所有这些都有效:

prefix func ~(bit: Bit) -> Bit {
    return Bit(rawValue: ~bit.rawValue)!
}

我搜索过Swift 2.1文档,但我不明白为什么这会引发异常。

就像一个注释一样,枚举初始化器是可用的,因此可以解包。另外,我知道Swift中已经存在Bit类型(我只给出了一个类似于我实际实现的示例)。

1 个答案:

答案 0 :(得分:0)

我意识到我的问题的答案实际上非常明显,我在撰写这篇文章时意识到了这一点。

我在Xcode Playground中进行了以下测试:

let zero = Bit.Zero
~zero.rawValue // 255 which is 0b1111_1111

所以问题是Bit没有case代表0b1111_1111的二进制值。因此,当重载的按位NOT函数明确解开Bit可选的时,它就会展开nil

// Not explicitly unwrapping the optional
Bit(rawValue: ~zero.rawValue) // nil

// Explicitly unwrapping the optional
Bit(rawValue: ~zero.rawValue)! // Exception ... EXC_BAD_INSTRUCTION ...

我希望它的工作方式如下:

prefix func ~(bit: Bit) -> Bit {
    switch bit {
    case .Zero:
        return .One
    case .One:
        return .Zero
    }
}

我希望这可以帮助其他人像我这样的简单错误。

干杯!