#1。使用zip(_:_:) 将String 数组的元素与Int 数组的元素组合成String 的新数组
在 Swift 3 中,Swift 标准库提供了zip(_:_:) 函数。 zip(_:_:) 有以下声明:
func zip<Sequence1, Sequence2>(_ sequence1: Sequence1, _ sequence2: Sequence2) -> Zip2Sequence<Sequence1, Sequence2> where Sequence1 : Sequence, Sequence2 : Sequence
创建由两个底层序列构成的对序列。
为了从Zip2Sequence 实例中获取新数组,您可以使用Zip2Sequence 的map(_:) 方法。下面使用 map(_:) 的 Playground 代码将您的字母和数字元素组合成一个新的 String 数组:
let letterArray = ["a", "b", "c", "d", "e"]
let numberArray = [1, 2, 3, 4, 5, 6, 7]
let zipSequence = zip(letterArray, numberArray)
let finalArray = zipSequence.map({ (tuple: (letter: String, number: Int)) -> String in
return tuple.letter + String(tuple.number)
})
print(finalArray) // prints ["a1", "b2", "c3", "d4", "e5"]
你可以用更简洁的风格重构之前的代码:
let letterArray = ["a", "b", "c", "d", "e"]
let numberArray = [1, 2, 3, 4, 5, 6, 7]
let finalArray = zip(letterArray, numberArray).map { $0.0 + String($0.1) }
print(finalArray) // prints ["a1", "b2", "c3", "d4", "e5"]
作为map(_:) 的替代方案,您可以使用Zip2Sequence 的reduce(_:_:) 方法:
let letterArray = ["a", "b", "c", "d", "e"]
let numberArray = [1, 2, 3, 4, 5, 6, 7]
let zipSequence = zip(letterArray, numberArray)
let finalArray = zipSequence.reduce([]) { (partialResult: [String], tuple: (letter: String, number: Int)) -> [String] in
return partialResult + [tuple.letter + String(tuple.number)]
}
print(finalArray) // prints ["a1", "b2", "c3", "d4", "e5"]
#2。使用Array扩展自定义方法将String数组的元素与Int数组的元素组合成String的新数组
如果您不想使用zip(_:_:),您可以创建自己的Array 扩展方法以获得预期的结果。下面的 Playground 代码显示了如何创建它:
extension Array where Element == String {
func mergeLettersWithNumbers(from numberArray: [Int]) -> [String] {
var index = startIndex
let iterator: AnyIterator<String> = AnyIterator {
defer { index = self.index(index, offsetBy: 1) }
guard index < self.endIndex, index < numberArray.endIndex else { return nil }
return self[index] + String(numberArray[index])
}
return Array(iterator)
}
}
let letterArray = ["a", "b", "c", "d", "e"]
let numberArray = [1, 2, 3, 4, 5, 6, 7]
let newArray = letterArray.mergeLettersWithNumbers(from: numberArray)
print(newArray) // prints ["a1", "b2", "c3", "d4", "e5"]