Объявление и использование перечисления битовых полей в Swift

Как объявить битовые поля и использовать их в 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 импортирует типы перечисления Foundation, и делает это, определяя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.

Ответы на вопрос(13)

Ваш ответ на вопрос