Эта концепция называется созданием декартовых произведений. Мы можем использовать следующий код из здесь , чтобы сделать это
let arrColor = ["red","green","blue"]
let arrSize = ["L","M"]
let arrMaterial = ["Cotton","polyester"]
let arrstyle = ["Eastern","Western"]
func + <T>(el: T, arr: [T]) -> [T] {
var ret = arr
ret.insert(el, at: 0)
return ret
}
func cartesianProduct<T>(_ arrays: [T]...) -> [[T]] {
guard let head = arrays.first else {
return []
}
let first = Array(head)
func pel(
_ el: T,
_ ll: [[T]],
_ a: [[T]] = []
) -> [[T]] {
switch ll.count {
case 0:
return a.reversed()
case _:
let tail = Array(ll.dropFirst())
let head = ll.first!
return pel(el, tail, el + head + a)
}
}
return arrays.reversed()
.reduce([first], {res, el in el.flatMap({ pel($0, res) }) })
.map({ $0.dropLast(first.count) })
}
let arrResult = cartesianProduct(arrColor,arrSize,arrMaterial,arrstyle)
print(arrResult)
Вывод:
[["red", "L", "Cotton", "Eastern"], ["red", "L", "Cotton", "Western"], ["red", "L", "polyester", "Eastern"], ["red", "L", "polyester", "Western"], ["red", "M", "Cotton", "Eastern"], ["red", "M", "Cotton", "Western"], ["red", "M", "polyester", "Eastern"], ["red", "M", "polyester", "Western"],
["green", "L", "Cotton", "Eastern"], ["green", "L", "Cotton", "Western"], ["green", "L", "polyester", "Eastern"], ["green", "L", "polyester", "Western"], ["green", "M", "Cotton", "Eastern"], ["green", "M", "Cotton", "Western"], ["green", "M", "polyester", "Eastern"], ["green", "M", "polyester", "Western"],
["blue", "L", "Cotton", "Eastern"], ["blue", "L", "Cotton", "Western"], ["blue", "L", "polyester", "Eastern"], ["blue", "L", "polyester", "Western"], ["blue", "M", "Cotton", "Eastern"], ["blue", "M", "Cotton", "Western"], ["blue", "M", "polyester", "Eastern"], ["blue", "M", "polyester", "Western"]]