Как должны быть объявлены и использованы битовые поля в 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.