在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枚举类型,它是通过定义struct符合RawOptionSet协议的a 来实现的:
struct
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桥如何表示它们的方式。
您可以构建struct符合RawOptionSet协议的,并且可以像内置enum类型一样使用它,但也具有位掩码功能。这里的答案显示了如何: Swift NS_OPTIONS样式的位掩码枚举。
enum