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

Reply via email to