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