如何在Swift中连接或合并数组?
如果有两个像这样快速创build的数组:
var a:[CGFloat] = [1, 2, 3] var b:[CGFloat] = [4, 5, 6]
他们怎么能合并到[1, 2, 3, 4, 5, 6]
?
你可以用+
连接数组,构build一个新的数组
let c = a + b print(c) // [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
或用+=
(或extend
)将另一个数组添加到另一个数组中:
a += b // Or: a.extend(b) // Swift 1.2 a.appendContentsOf(b) // Swift 2 a.append(contentsOf: b) // Swift 3 print(a) // [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
随着Swift 3,根据你的需要和口味,你可以select以下五种方法之一来连接/合并两个数组。
1.用Swift standard library
的+(_:_:)
generics运算符将两个数组合并成一个新的数组
Swift标准库定义了一个+(_:_:)
generics运算符。 +(_:_:)
具有以下声明 :
func +<RRC1 : RangeReplaceableCollection, RRC2 : RangeReplaceableCollection where RRC1.Iterator.Element == RRC2.Iterator.Element>(lhs: RRC1, rhs: RRC2) -> RRC1
通过连接两个集合的元素来创build一个新的集合。
以下Playground代码显示了如何使用+(_:_:)
generics运算符将两个[Int]
数组合并到一个新数组中:
let array1 = [1, 2, 3] let array2 = [4, 5, 6] let flattenArray = array1 + array2 print(flattenArray) // prints [1, 2, 3, 4, 5, 6]
2.使用Array
的append(contentsOf:)
方法append(contentsOf:)
数组追加到另一个数组
Swift Array
有一个append(contentsOf:)
方法。 append(contentsOf:)
具有以下声明 :
public mutating func append<S>(contentsOf newElements: S) where S : Sequence, S.Iterator.Element == Element)
将序列或集合的元素添加到此集合的末尾。
以下Playground代码显示了如何使用append(contentsOf:)
方法append(contentsOf:)
数组追加到另一个types为[Int]
数组:
var array1 = [1, 2, 3] let array2 = [4, 5, 6] array1.append(contentsOf: array2) print(array1) // prints [1, 2, 3, 4, 5, 6]
3.使用Sequence
的flatMap(_:)
方法将两个数组合并到一个新数组中
Swift为符合Sequence
协议(包括Array
)的所有types提供了flatMap(_:)
方法。 flatMap(_:)
具有以下声明 :
func flatMap<SegmentOfResult : Sequence>(_ transform: (Self.Iterator.Element) throws -> SegmentOfResult) rethrows -> [SegmentOfResult.Iterator.Element]
返回一个数组,其中包含使用此序列的每个元素调用给定转换的连接结果。
以下Playground代码显示了如何使用flatMap(_:)
方法将两个[Int]
数组合并到一个新数组中:
let array1 = [1, 2, 3] let array2 = [4, 5, 6] let flattenArray = [array1, array2].flatMap({ (element: [Int]) -> [Int] in return element }) print(flattenArray) // prints [1, 2, 3, 4, 5, 6]
4.使用Sequence
的joined()
方法和Array
的init(_:)
初始化方法将两个数组合并到一个新数组中
Swift为符合Sequence
协议(包括Array
)的所有types提供了一个joined()
方法。 joined()
具有以下声明 :
func joined() -> FlattenSequence<Self>
返回串联序列的元素。
另外,Swift Array
有一个init(_:)
初始值设定项。 init(_:)
具有以下声明 :
init<S : Sequence where S.Iterator.Element == Element>(_ s: S)
创build一个包含序列元素的数组。
因此,以下Playground代码显示如何使用joined()
方法和init(_:)
初始化方法将两个[Int]
数组合并到一个新数组中:
let array1 = [1, 2, 3] let array2 = [4, 5, 6] let flattenCollection = [array1, array2].joined() // type: FlattenBidirectionalCollection<[Array<Int>]> let flattenArray = Array(flattenCollection) print(flattenArray) // prints [1, 2, 3, 4, 5, 6]
5.使用Array
的reduce(_:_:)
方法将两个数组合并到一个新数组中
Swift Array
有一个reduce(_:_:)
方法。 reduce(_:_:)
具有以下声明 :
func reduce<Result>(_ initialResult: Result, _ nextPartialResult: (Result, Element) throws -> Result) rethrows -> Result
返callback用给定组合闭包的结果,该顺序的每个元素和一个累加值。
以下Playground代码显示如何使用reduce(_:_:)
方法将两个[Int]
数组合并到一个新数组中:
let array1 = [1, 2, 3] let array2 = [4, 5, 6] let flattenArray = [array1, array2].reduce([], { (result: [Int], element: [Int]) -> [Int] in return result + element }) print(flattenArray) // prints [1, 2, 3, 4, 5, 6]
我最喜欢的方法,因为斯威夫特2.0 平坦
var a:[CGFloat] = [1, 2, 3] var b:[CGFloat] = [4, 5, 6] let c = [a, b].flatten()
这将返回FlattenBidirectionalCollection
所以如果你只是想要一个CollectionType
这将是足够的,你将有懒惰评价免费。 如果你需要完全的数组,你可以这样做:
let c = Array([a, b].flatten())
如果你不是运营商重载的粉丝,或者更多的functiontypes:
let result = [ ["merge", "me"], ["We", "shall", "unite"], ["magic"] ].flatMap { $0 }
为了完成可能的select列表,可以使用reduce
来实现flatten的行为:
var a = ["a", "b", "c"] var b = ["d", "e", "f"] let res = [a, b].reduce([],combine:+)
所提出的最好的select(性能/记忆方式)是简单的flatten
,只是懒散地包装原始数组而不创build新的数组结构。
但请注意, flatten 不会返回 LazyColletion
,所以惰性行为将不会传播到链中的下一个操作(map,flatMap,filter等)。
如果懒惰在你的特定情况下是有意义的,只要记住在flatten()
前面加一个.lazy
,例如用这种方式修改Tomasz的例子:
let c = [a, b].lazy.flatten()
如果你想在第二个数组之后插入一个特定的索引,你可以这样做(从Swift 2.2开始):
let index = 1 if 0 ... a.count ~= index { a[index..<index] = b[0..<b.count] } print(a) // [1.0, 4.0, 5.0, 6.0, 2.0, 3.0]
Swift 3.0
您可以使用加法运算符( +
)将两个具有兼容types的现有数组加在一起来创build一个新数组。 新数组的types是从你添加在一起的两个数组的types推断出来的,
let arr0 = Array(repeating: 1, count: 3) // [1, 1, 1] let arr1 = Array(repeating: 2, count: 6)//[2, 2, 2, 2, 2, 2] let arr2 = arr0 + arr1 //[1, 1, 1, 2, 2, 2, 2, 2, 2]
这是上述代码的正确结果。
这是合并两个数组的最简单的方法。
var array1 = [1,2,3] let array2 = [4,5,6]
连接/合并它们
array1 += array2 New value of array1 is [1,2,3,4,5,6]
Marge数组是不同的数据types:
var arrayInt = [Int]() arrayInt.append(6) var testArray = ["a",true,3,"b"] as [Any] testArray.append(someInt)
输出:
["a", true, 3, "b", "hi", 3, [6]]