2016-09-30 2 views
3

Avec la OptionSet suivante: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] 
} 

Comment puis-je comparer un octet

var statusFlags: UInt8 = 0b00000000 

des options?

Voici ce que je pense fonctionnerait, mais provoque une erreur de jeux:

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

Merci

Répondre

6

Depuis .Disarmed est égal à zéro, vous dites:

if statusFlags == .Disarmed 

ou même plus simplement:

if statusFlags.isEmpty 

Pour d'autres valeurs, vous dites, par exemple .:

if statusFlags.contains(.CountdownDuration3) 

C'est le tout point de d'un OptionSet. Vous utilisez les opérations et non les opérations arithmétiques.

Mais pour que cela fonctionne, afin que vous puissiez profiter de la bonté délicieuse de OptionSet, statusFlags besoins à être un StatusOptions. Vous pouvez le faire par des StatusOptions rawValue: initialiseur:

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

(Notez que Swift 3, un zéro bitmask comme .Disarmed ne serait probablement pas utilisé même zéro est juste un ensemble vide..)