试试这个:
extension Array {
//Mutating
mutating func weave(with array: Array) -> Array {
precondition(!isEmpty && !array.isEmpty)
var weavedArray = Array<Element>()
weavedArray.reserveCapacity(count + array.count)
var inputArray = array
for _ in 0..<[count, array.count].min()! {
weavedArray.append(self.removeFirst())
weavedArray.append(inputArray.removeFirst())
}
let largerArr = largerOf(self, inputArray)
if largerArr.count != 0 {
weavedArray.append(contentsOf: largerArr)
}
self = weavedArray
return weavedArray
}
//Non-mutating
func weaved(with array: Array) -> Array {
precondition(!isEmpty && !array.isEmpty)
var weavedArray = Array<Element>()
weavedArray.reserveCapacity(count + array.count)
var selfArray = self
var inputArray = array
for _ in 0..<[count, array.count].min()! {
weavedArray.append(selfArray.removeFirst())
weavedArray.append(inputArray.removeFirst())
}
let largerArr = largerOf(selfArray, inputArray)
if largerArr.count != 0 {
weavedArray.append(contentsOf: largerArr)
}
return weavedArray
}
internal func largerOf<T>(_ arr1: Array<T>, _ arr2: Array<T>) -> Array<T> {
switch (arr1.count, arr2.count) {
case (let a, let b) where a > b: return arr1
case (let a, let b) where a < b: return arr2
case (let a, let b) where a == b: return arr1
default: return arr2
}
}
}
用法
变异 - .weave(with: )
let odds = [1, 3, 5, 7, 9]
let evens = [2, 4, 6, 8, 10]
odds.weave(with: evens)
print(odds) //prints: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print(evens) //prints: [2, 4, 6, 8, 10]
非变异 - .weaved(with: )
let odds = [1, 3, 5, 7, 9]
let evens = [2, 4, 6, 8, 10]
let firstTen = odds.weaved(with: evens)
print(firstTen) // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print(odds) //prints: [1, 3, 5, 7, 9]
priny(evens) //prints: [2, 4, 6, 8, 10]
希望对您有所帮助,如果您还有其他问题,请随时提问!