一尘不染

在Swift中声明和使用位域枚举

swift

在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 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桥如何表示它们的方式。


阅读 466

收藏
2020-07-07

共1个答案

一尘不染

您可以构建struct符合RawOptionSet协议的,并且可以像内置enum类型一样使用它,但也具有位掩码功能。这里的答案显示了如何:
Swift NS_OPTIONS样式的位掩码枚举

2020-07-07