如何在Swift中声明和使用位域?
声明这样的枚举可以正常工作,但是一起尝试OR 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如何导入基础枚举类型,并通过定义符合RawOptionSet协议的结构来实现:
- 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桥只代表它们。
您可以构建符合RawOptionSet协议的结构,您可以像内置枚举类型一样使用它,但也可以使用位掩码功能。这里的答案显示如何:
Swift NS_OPTIONS-style bitmask enumerations。
Swift NS_OPTIONS-style bitmask enumerations。