2016-09-30 2 views
3

Со следующим OptionSet:Swift 3,0 OptionSet Bit Test

struct StatusOptions : OptionSet { 
    let rawValue: Int 
    static let CountdownDuration0 = StatusOptions(rawValue: 1 << 0) 
    static let CountdownDuration1 = StatusOptions(rawValue: 1 << 1) 
    static let CountdownDuration2 = StatusOptions(rawValue: 1 << 2) 
    static let CountdownDuration3 = StatusOptions(rawValue: 1 << 3) 
    static let CountdownDuration4 = StatusOptions(rawValue: 1 << 4) 
    static let CountdownDuration5 = StatusOptions(rawValue: 1 << 5) 
    static let HomeMode = StatusOptions(rawValue: 1 << 6) 
    static let AwayMode = StatusOptions(rawValue: 1 << 7) 

    static let Disarmed: StatusOptions = [] 
    static let ArmedHome: StatusOptions = .HomeMode 
    static let ArmedAway: StatusOptions = .AwayMode 
    static let ArmedBoth: StatusOptions = [.HomeMode, .AwayMode] 
    static let ArmingCountdown: StatusOptions = [.CountdownDuration0, .CountdownDuration1, .CountdownDuration2, .CountdownDuration3, .CountdownDuration4, .CountdownDuration5] 
} 

Как сравнить байт

var statusFlags: UInt8 = 0b00000000 

к вариантам?

Ниже то, что я думаю, что будет работать, но вызывает ошибку площадка:

if (statusFlags & .Disarmed) { 
    print("Disarmed") 
} 

Благодаря

ответ

6

С .Disarmed равен нулю, вы говорите:

if statusFlags == .Disarmed 

или даже более просто:

if statusFlags.isEmpty 

Для других значений, вы говорите, например .:

if statusFlags.contains(.CountdownDuration3) 

То есть вся точка из OptionSet. Вы используете набор операций, а не арифметических битовых операций.

Но для этого, чтобы работать, так что вы можете воспользоваться вкусными благостями OptionSet, в statusFlags потребности в быть StatusOptions. Вы можете сделать это путем из StatusOptions rawValue: инициализатор:

let statusFlags = StatusOptions(rawValue:0b00000000) 
statusFlags.isEmpty // true 

(Обратите внимание, что в Swift 3, вероятно, не будет даже использовать нулевой битовая как .Disarmed Нулевой просто пустое множество.).

Смежные вопросы