我在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
类型(我只给出了一个类似于我实际实现的示例)。
答案 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
}
}
我希望这可以帮助其他人像我这样的简单错误。
干杯!