Ios 使用;“地图”;在Swift中创建两个数组的超集

Ios 使用;“地图”;在Swift中创建两个数组的超集,ios,arrays,swift,xcode,Ios,Arrays,Swift,Xcode,假设我有两个数组: let letterArray = ["a", "b", "c", "d", "e"...] let numberArray = [1, 2, 3, 4, 5, 6, 7...] 我想合并这两个数组,以便得到 ["a1", "b2", "c3", "d4", "e5"] 我该怎么做呢?您可以在地图之前使用: let a = ["a", "b", "c", "d", "e"] let b = [1, 2, 3, 4, 5] let result = zip(a, b).m

假设我有两个数组:

let letterArray = ["a", "b", "c", "d", "e"...]
let numberArray = [1, 2, 3, 4, 5, 6, 7...]
我想合并这两个数组,以便得到

["a1", "b2", "c3", "d4", "e5"]
我该怎么做呢?

您可以在地图之前使用:

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) // => ["a1", "b2", "c3", "d4", "e5"]


生成一个自定义,该自定义具有协议的特殊实现,因此它可以迭代从两个源集合生成的对。

实际上,您可以仅使用
映射

如果两个序列的大小相同,只需
枚举
映射

let result = letterArray.enumerate().map { $0.element + String(numberArray[$0.index]) }
如果您不确定哪一个较大,并且您想使用较小的平面贴图进行修剪,请将不需要的值删除:

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标准库提供了以下功能
zip(::)
具有以下声明:

func zip<Sequence1, Sequence2>(_ sequence1: Sequence1, _ sequence2: Sequence2) -> Zip2Sequence<Sequence1, Sequence2> where Sequence1 : Sequence, Sequence2 : Sequence

您可以使用非常简洁的样式重构前面的代码:

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
的方法:


#2.使用
Array
扩展自定义方法将
String
数组的元素与
Int
数组的元素组合成一个新的
String
如果不想使用
zip(::)
,可以创建自己的
数组
扩展方法以获得预期结果。下面的游乐场代码显示了如何创建它:

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"]
扩展数组,其中元素==字符串{
func mergeLettersWithNumbers(来自numberArray:[Int])->[String]{
var指数=startIndex
让迭代器:AnyIterator=AnyIterator{
延迟{index=self.index(index,offsetBy:1)}
保护索引
'Superset'类似于:
[“a”,“b”,…,1,2,…]
如果您要平面映射它,您可以在第一次通过时就这样做
let result:[String]=letterArray.enumerate().flatMap{guard numberraray.count>$0.index else{return.None}返回$0.element+String(numberraray[$0.index])}
slow@AMomchilov我不会争论清楚的部分。我也不会使用它(我认为zip+map更具可读性),但我只是想表明,只使用map是可能的。啊,是的,我承认。这是一个聪明的方法:p。您还可以直接映射整数:
[0。。
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"]
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"]