在Swift中使用“Map”创build两个数组的超集
比方说,我有两个数组:
let letterArray = ["a", "b", "c", "d", "e"...] let numberArray = [1, 2, 3, 4, 5, 6, 7...]
我想结合这两个数组,以便我会得到一个输出
["a1", "b2", "c3", "d4", "e5"]
我将如何去做呢?
你可以在map之前使用zip(_:_:)
:
let a = ["a", "b", "c", "d", "e"] let b = [1, 2, 3, 4, 5] let result = zip(a, b).map{$0 + String($1)} print(result)
你可以在这里试试这个代码。
zip(_:_:)
生成一个自定义的Zip2Sequence
,它具有SequenceType
协议的特殊实现,以便迭代由两个源集合构成的对。
其实你只能用map
来做!
如果这两个序列具有相同的大小,只需enumerate
和map
:
let result = letterArray.enumerate().map { $0.element + String(numberArray[$0.index]) }
如果你不确定哪一个更大,你想使用更小的flatMap
修剪掉不想要的值:
let result = letterArray.enumerate().flatMap { guard numberArray.count > $0.index else { return .None } return $0.element + String(numberArray[$0.index]) } as [String]
#1。 使用zip(_:_:)
将String
数组的元素与Int
数组的元素组合到一个新的String
数组中
使用Swift 3,Swift Standard Library提供了zip(_:_:)
函数。 zip(_:_:)
具有以下声明:
func zip<Sequence1, Sequence2>(_ sequence1: Sequence1, _ sequence2: Sequence2) -> Zip2Sequence<Sequence1, Sequence2> where Sequence1 : Sequence, Sequence2 : Sequence
创build由两个基础序列构成的一系列对。
为了从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(_:_:)
,则可以创build自己的Array
扩展方法以获得预期的结果。 下面的Playground代码显示了如何创build它:
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"]