Last active
November 25, 2017 15:08
-
-
Save matt-curtis/26150bf34a1de3e4c0c65619a3ee65df to your computer and use it in GitHub Desktop.
(Better?) OptionSet
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
struct Traits: OptionSet { | |
var rawValue: Int = 0 | |
init(rawValue: Int) { | |
self.rawValue = rawValue | |
} | |
} | |
extension Traits { | |
enum Trait: Int { | |
case bolded, italicized, monospaced, underlined, outlined | |
} | |
static func trait(_ trait: Trait) -> Traits { | |
return Traits(rawValue: 1 << trait.rawValue) | |
} | |
static func traits(_ traits: Set<Trait>) -> Traits { | |
return Traits(rawValue: traits.reduce(0) { | |
prev, trait in | |
prev + (1 << trait.rawValue) | |
}) | |
} | |
var set: Set<Trait> { | |
get { | |
var result: Set<Trait> = [] | |
var i = 0 | |
while let trait = Trait(rawValue: i) { | |
if self.rawValue & (1 << trait.rawValue) > 0 { | |
result.insert(trait) | |
} | |
i += 1 | |
} | |
return result | |
} | |
set(newSet) { | |
self = .traits(newSet) | |
} | |
} | |
} | |
var traits = Traits(rawValue: 0) | |
traits.insert(.traits([ .bolded, .monospaced, .underlined ])) | |
traits.remove(.trait(.bolded)) | |
traits.contains(.trait(.monospaced)) | |
traits.set = [ .bolded ] | |
traits.set.remove(.bolded) | |
traits.set |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment