【发布时间】:2014-07-29 12:36:18
【问题描述】:
在 Swift 中应该如何声明和使用位域?
像这样声明一个枚举确实有效,但尝试将 2 个值组合在一起无法编译:
enum MyEnum: Int
{
case One = 0x01
case Two = 0x02
case Four = 0x04
case Eight = 0x08
}
// This works as expected
let m1: MyEnum = .One
// Compiler error: "Could not find an overload for '|' that accepts the supplied arguments"
let combined: MyEnum = MyEnum.One | MyEnum.Four
我查看了 Swift 如何导入 Foundation 枚举类型,它通过定义符合 RawOptionSet 协议的 struct 来做到这一点:
struct NSCalendarUnit : RawOptionSet {
init(_ value: UInt)
var value: UInt
static var CalendarUnitEra: NSCalendarUnit { get }
static var CalendarUnitYear: NSCalendarUnit { get }
// ...
}
而RawOptionSet 协议是:
protocol RawOptionSet : LogicValue, Equatable {
class func fromMask(raw: Self.RawType) -> Self
}
但是,没有关于此协议的文档,我自己也不知道如何实现它。此外,不清楚这是否是官方的 Swift 实现位字段的方式,或者这只是 Objective-C 桥如何表示它们。
【问题讨论】:
-
你试过
let combined: MyEnum = MyEnum.One | MyEnum.Four -
它给出了一个更重要的错误信息,我会更新这个问题。感谢您的提醒!
-
有趣。我可以得到或接受参数的唯一方法是
let combined = 0x01 | 0x04 -
值得一提的是
MyEnum.One!=0x01如果要获取实际数值,则需要使用MyEnum.One.toRaw()
标签: enums swift bit-fields