如果在swift中创建了两个数组,就像这样:

var a:[CGFloat] = [1, 2, 3]
var b:[CGFloat] = [4, 5, 6]

如何将它们合并为[1,2,3,4,5,6]?


当前回答

斯威夫特3.0

通过使用加法运算符(+)将两个类型兼容的现有数组相加,可以创建一个新数组。新数组的类型是从你相加的两个数组的类型推断出来的,

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]

这是上述代码的正确结果。

其他回答

为了完成可能的选项列表,可以使用reduce来实现flatten的行为:

var a = ["a", "b", "c"] 
var b = ["d", "e", "f"]

let res = [a, b].reduce([],combine:+)

在这些方案中,最好的替代方案(性能/内存方面)是简单的扁平化,它只是惰性地包装原始数组,而不创建新的数组结构。

但是请注意flatten并不返回一个LazyCollection,因此懒惰行为不会沿着链传播到下一个操作(map、flatMap、filter等等)。

如果lazy在你的特定情况下是有意义的,只需要记住在flatten()前加上一个.lazy,例如,这样修改Tomasz sample:

let c = [a, b].lazy.flatten()

如果你正在处理大型序列,那么更有效的方法是使用Apple算法包中定义的链方法。

let n1 = [1, 2, 3]
let n2 = [4, 5, 6]

let allNumbers = chain(n1, n2)
for num in allNumbers {
    print(num) // for loop prints 1 to 6
}

// Similarly for String type
let s = chain("foo", "BAR") // produces "fooBAR"

Chain相对于其他方法的优点:

允许混合不同的序列类型

let n = chain([10, 20, 30], 1...3) // will produce 10, 20, 30, 1, 2, 3

不进行新的内存分配

chain方法本质上迭代第一个序列,当它在第一个序列中遇到endIndex时,它就开始无缝地迭代第二个序列。

自Swift 2.0以来,我最喜欢的方法是扁平化

var a:[CGFloat] = [1, 2, 3]
var b:[CGFloat] = [4, 5, 6]

let c = [a, b].flatten()

这将返回flatbidirectionalcollection,所以如果你只是想要一个CollectionType,这就足够了,你将有免费的懒惰求值。如果你确实需要数组,你可以这样做:

let c = Array([a, b].flatten())

斯威夫特4。X

我知道的最简单的方法就是用+号

var Array1 = ["Item 1", "Item 2"]
var Array2 = ["Thing 1", "Thing 2"]

var Array3 = Array1 + Array2

// Array 3 will just be them combined :)
var arrayOne = [1,2,3]
var arrayTwo = [4,5,6]

如果你想要的结果是:[1,2,3,[4,5,6]]

arrayOne.append(arrayTwo)

上面的代码将arrayOne转换为单个元素,并将其添加到arrayTwo的末尾。

如果你想要的结果是:[1,2,3,4,5,6],那么,

arrayOne.append(contentsOf: arrayTwo)

上面的代码将arrayOne的所有元素添加到arrayTwo的末尾。

谢谢。