[swift-users] Reducing Array<OptionSet> to OptionSet

Jon Shier jon at jonshier.com
Thu Nov 3 20:09:57 CDT 2016


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


More information about the swift-users mailing list