Yes indeed! Apparently union works with the generic but insert did not. Strange. Anyway, I ended up here:
func reducedOptions<T: OptionSet>(_ options: [T]) -> T { return options.reduce(T()) { return $0.union($1) } } Thanks! Jon > On Nov 3, 2016, at 9:56 PM, Erica Sadun <er...@ericasadun.com> wrote: > > How about > > func joinOptionSets<OS: OptionSet>(_ sets: [OS]) -> OS { > return sets.reduce([] as OS) { > (result, set) in return result.union(set) > } > } > > joinOptionSets(sets).rawValue > > > -- E > >> On Nov 3, 2016, at 7:48 PM, Erica Sadun via swift-users >> <swift-users@swift.org <mailto:swift-users@swift.org>> wrote: >> >> Like this? >> >> let sets: [MyOptionSet] = [MyOptionSet(strings: ["one"]), >> MyOptionSet(strings: ["two"]), MyOptionSet(strings: ["one", "two"])] >> let unioned = sets.reduce(MyOptionSet(rawValue: 0)) { >> (result, set) in return result.union(set) >> } >> unioned.rawValue >> >> >>> On Nov 3, 2016, at 7:44 PM, Jon Shier <j...@jonshier.com >>> <mailto:j...@jonshier.com>> wrote: >>> >>> Thanks Erica. I’ve been able to transform arrays of strings into arrays of >>> my OptionSets using an enum approach like you describe. I was looking more >>> for a generic approach that I could apply to all of the various OptionSets >>> I have to decode from JSON. I suppose whether it’s from an array of strings >>> or array of the OptionSet is less important, but getting to the array of >>> the OptionSet itself is something I can already do. >>> >>> >>> Thanks, >>> >>> Jon >>> >>>> On Nov 3, 2016, at 9:37 PM, Erica Sadun <er...@ericasadun.com >>>> <mailto:er...@ericasadun.com>> wrote: >>>> >>>> Maybe something like this? Or you could just bitwise || individual sets. >>>> Or you could use a dictionary to lookup [string: rawValue]. etc. >>>> >>>> public struct MyOptionSet: OptionSet { >>>> public static let one = MyOptionSet(rawValue: 1 << 0) >>>> public static let two = MyOptionSet(rawValue: 1 << 1) >>>> public static let three = MyOptionSet(rawValue: 1 << 2) >>>> >>>> public var rawValue: Int { return _rawValue } >>>> public init(rawValue: Int) { self._rawValue = rawValue } >>>> private let _rawValue: Int >>>> >>>> private enum StringEnum: String { case one, two, three } >>>> public init(strings: [String]) { >>>> var set = MyOptionSet() >>>> strings.flatMap({ StringEnum(rawValue: $0) }) >>>> .flatMap({ MyOptionSet(rawValue: 1 << $0.hashValue) }) >>>> .forEach { set.insert($0) } >>>> _rawValue = set.rawValue >>>> } >>>> } >>>> >>>> let stringArray: [String] = ["one", "three"] >>>> let stringOptions = MyOptionSet(strings: stringArray) >>>> stringOptions.rawValue >>>> >>>>> On Nov 3, 2016, at 7:09 PM, Jon Shier via swift-users >>>>> <swift-users@swift.org <mailto:swift-users@swift.org>> wrote: >>>>> >>>>> Swifters: >>>>> I’m dealing with a JSON API where sets of options are returned as >>>>> arrays of strings. Representing these as OptionSets seems ideal. I can >>>>> decode the arrays of strings into an array of individual OptionSet >>>>> values, but I’ve run into a dead end when trying generically reduce the >>>>> array of OptionSets to a single OptionSet value. I’ve tried variety of >>>>> ways of definition a Collection extension, even tried defining a global >>>>> function, but I can’t seem to use the OptionSet sequence initializer or >>>>> reduce itself (cannot invoke insert with argument of type (OptionSet) (or >>>>> T)). Any guidance here? >>>>> Here’s what I’ve tried: >>>>> >>>>> extension Collection where Iterator.Element == OptionSet { >>>>> >>>>> func reduced() -> Iterator.Element { >>>>> return reduce(Iterator.Element()) { >>>>> var newResult = $0 >>>>> newResult.insert($1) >>>>> return newResult >>>>> } >>>>> } >>>>> >>>>> } >>>>> >>>>> extension Collection where Iterator.Element == OptionSet { >>>>> >>>>> func reduced<T: OptionSet>() -> T { >>>>> return reduce(T()) { >>>>> var newResult = $0 >>>>> newResult.insert($1) >>>>> return newResult >>>>> } >>>>> } >>>>> >>>>> } >>>>> >>>>> >>>>> extension Collection where Iterator.Element == OptionSet { >>>>> func reduced() -> Iterator.Element { >>>>> return Iterator.Element(self) >>>>> } >>>>> } >>>>> >>>>> func reduced<T: OptionSet>(_ options: [T]) -> T { >>>>> return options.reduce(T()) { >>>>> var newResult = $0 >>>>> newResult.insert($1) >>>>> >>>>> return newResult >>>>> } >>>>> } >>>>> >>>>> Jon Shier >>>>> _______________________________________________ >>>>> swift-users mailing list >>>>> swift-users@swift.org <mailto:swift-users@swift.org> >>>>> https://lists.swift.org/mailman/listinfo/swift-users >>>>> <https://lists.swift.org/mailman/listinfo/swift-users> >>>> >>> >> >> _______________________________________________ >> swift-users mailing list >> swift-users@swift.org <mailto:swift-users@swift.org> >> https://lists.swift.org/mailman/listinfo/swift-users >
_______________________________________________ swift-users mailing list swift-users@swift.org https://lists.swift.org/mailman/listinfo/swift-users