Вы можете сначала получить все элементы подмножества, присоединить их и использовать команду Reduce для суммирования элементов:
extension RangeReplaceableCollection {
public var subSets: [SubSequence] {
return isEmpty ? [SubSequence()] : dropFirst().subSets.lazy.flatMap { [$0, prefix(1) + $0] }
}
}
let subSets = [1,2,3].subSets // [[], [1], [2], [1, 2], [3], [1, 3], [2, 3], [1, 2, 3]]
let sum = subSets.joined().reduce(0,+) // 24
или
let sum = subSets.reduce(0) { $1.reduce($0,+) }
Обратите внимание, что, расширяя RangePlaceableCollection
и возвращая SubSequence
, вы сможете использовать его также с типами StringProtocol, такими как String
s и Substring
s:
let characters = Array("123")
let charactersSubSets = characters.subSets // [[], ["1"], ["2"], ["1", "2"], ["3"], ["1", "3"], ["2", "3"], ["1", "2", "3"]]
let stringSubSets = "123".subSets // ["", "1", "2", "12", "3", "13", "23", "123"]
let substringSubSets = "1234".dropLast().subSets // ["", "1", "2", "12", "3", "13", "23", "123"]