I have a custom OptionSetType struct in Swift. How can I enumerate all values of an instance?
This is my OptionSetType:
struct WeekdaySet: OptionSetType {
let rawValue: UInt8
init(rawValue: UInt8) {
self.rawValue = rawValue
}
static let Sunday = WeekdaySet(rawValue: 1 << 0)
static let Monday = WeekdaySet(rawValue: 1 << 1)
static let Tuesday = WeekdaySet(rawValue: 1 << 2)
static let Wednesday = WeekdaySet(rawValue: 1 << 3)
static let Thursday = WeekdaySet(rawValue: 1 << 4)
static let Friday = WeekdaySet(rawValue: 1 << 5)
static let Saturday = WeekdaySet(rawValue: 1 << 6)
}
I would like to something like this:
let weekdays: WeekdaySet = [.Monday, .Tuesday]
for weekday in weekdays {
// Do something with weekday
}
Based on the previous answers I created a generic Swift 4 solution with
IteratorProtocol
:Than in OptionSet extension implement
makeIterator()
assuming your
OptionSet
s will beInt
:Right now every time you create an OptionSet, just conform it to
Sequence
.You should now be able to iterate over it:
I'd also create a typealias to be explicit on what is used:
typealias SequenceOptionSet = OptionSet & Sequence
As of Swift 4, there are no methods in the standard library to enumerate the elements of an
OptionSetType
(Swift 2) resp.OptionSet
(Swift 3, 4).Here is a possible implementation which simply checks each bit of the underlying raw value, and for each bit which is set, the corresponding element is returned. The "overflow multiplication"
&* 2
is used as left-shift because<<
is only defined for the concrete integer types, but not for theIntegerType
protocol.Swift 2.2:
Example usage:
Swift 3:
Swift 4:
Here you go. I also added a convenience initializer to cut down on some of the boilerplate: