由于这不是语言内置的功能,因此这里提供一个具有类似签名的简单函数,类似于内置的zip
:
func cartesianProduct<Sequence1, Sequence2>(_ sequence1: Sequence1, _ sequence2: Sequence2) -> [(Sequence1.Element, Sequence2.Element)]
where Sequence1 : Sequence, Sequence2 : Sequence
{
var result: [(Sequence1.Element, Sequence2.Element)] = .init()
sequence1.forEach { value1 in
sequence2.forEach { value2 in
result.append((value1, value2))
}
}
return result
}
print(Array(zip([1, 2, 3], ["a", "b"])))
print(cartesianProduct([1, 2, 3], ["a", "b"]))
在您的情况下,您可以这样做:
cartesianProduct([1,2,3,4,5], ["one","two","three","four","five"])
.map { "\($0.1) \($0.0)" }
或者甚至:
cartesianProduct(1...5, ["one","two","three","four","five"])
.map { "\($0.1) \($0.0)" }
这两个都会生成序列:
["one 1", "two 1", "three 1", "four 1", "five 1", "one 2", "two 2", "three 2", "four 2", "five 2", ...]
由于在集合的元素上执行此操作很常见,因此我还创建了这两个函数扩展:
extension Collection {
func pairElementToEveryOtherElement() -> [(Self.Element, Self.Element)] {
var result = [(Self.Element, Self.Element)]()
for i in indices {
var j = index(after: i)
while j != endIndex {
result.append((self[i], self[j]))
j = index(after: j)
}
}
return result
}
public func pairElementToNeighbors() -> [(Self.Element, Self.Element)] {
if isEmpty {
return .init()
}
var result: [(Self.Element, Self.Element)] = .init()
var i = startIndex
while index(after: i) != endIndex {
result.append((self[i], self[index(after: i)]))
i = index(after: i)
}
return result
}
}
可以按照以下方式使用:
let inefficientHasDuplicatesCheck = myCollection
.pairElementToEveryOtherElement()
.contains { $0.0 == $0.1 }
zipWith
就可以解决问题:_.zipWith(array1, array2, function(a,b) { return a + ' ' + b; });
- BlueRaja - Danny Pflughoeft