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
> <[email protected]> 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 <[email protected]
>> <mailto:[email protected]>> 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 <[email protected]
>>> <mailto:[email protected]>> 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
>>>> <[email protected] <mailto:[email protected]>> 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
>>>> [email protected] <mailto:[email protected]>
>>>> https://lists.swift.org/mailman/listinfo/swift-users
>>>> <https://lists.swift.org/mailman/listinfo/swift-users>
>>>
>>
>
> _______________________________________________
> swift-users mailing list
> [email protected]
> https://lists.swift.org/mailman/listinfo/swift-users
_______________________________________________
swift-users mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-users