Skip to content

Instantly share code, notes, and snippets.

@matt-curtis
Last active November 25, 2017 15:08
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save matt-curtis/26150bf34a1de3e4c0c65619a3ee65df to your computer and use it in GitHub Desktop.
Save matt-curtis/26150bf34a1de3e4c0c65619a3ee65df to your computer and use it in GitHub Desktop.
(Better?) OptionSet
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