如何在Swift中连接或合并数组?

Hri*_*sto 377 arrays merge append ios swift

如果在swift中创建了两个数组,如下所示:

var a:[CGFloat] = [1, 2, 3]
var b:[CGFloat] = [4, 5, 6]
Run Code Online (Sandbox Code Playgroud)

他们如何合并[1, 2, 3, 4, 5, 6]

Mar*_*n R 659

您可以连接数组+,构建一个新数组

let c = a + b
print(c) // [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
Run Code Online (Sandbox Code Playgroud)

或者使用+=(或append)将一个数组附加到另​​一个数组:

a += b

// Or:
a.append(contentsOf: b)  // Swift 3
a.appendContentsOf(b)    // Swift 2
a.extend(b)              // Swift 1.2

print(a) // [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
Run Code Online (Sandbox Code Playgroud)

  • Khunshan:`AnyObject`表示一个对象,据我所知,这意味着从类类型中实例化的东西.`CGFloat`不是一个对象,它是一个标量值.据我所知,数组可以包含标量,除非它被定义为包含`AnyObject`或进一步细化.但是,我怀疑这里的问题是数组被包装成一个可选的,所以你必须首先用`!`或`?`打开它. (6认同)

Ima*_*tit 121

使用Swift 3,根据您的需求和品味,您可以选择以下五种方法之一来连接/合并两个数组.


1.合并两个阵列与一个新的数组Array+(_:_:)通用操作

Swift标准库定义了一个Array通用运算符.+(_:_:)有以下声明:

static func + <Other>(lhs: Array<Element>, rhs: Other) -> Array<Element> where Other : Sequence, Self.Element == Other.Element
Run Code Online (Sandbox Code Playgroud)

通过连接两个集合的元素来创建新集合.

以下Playground代码显示了如何+(_:_:)使用[Int]泛型运算符将两个类型的数组合并到一个新数组中:

let array1 = [1, 2, 3]
let array2 = [4, 5, 6]

let flattenArray = array1 + array2
print(flattenArray) // prints [1, 2, 3, 4, 5, 6]
Run Code Online (Sandbox Code Playgroud)

2.使用+(_:_:)'s Array方法将数组附加到另​​一个数组

斯威夫特+=(_:_:)有一种Array方法.+=(_:_:)有以下声明:

static func += <Other>(lhs: inout Array<Element>, rhs: Other) where Other : Sequence, Self.Element == Other.Element
Run Code Online (Sandbox Code Playgroud)

将序列或集合的元素添加到此集合的末尾.

以下Playground代码显示如何+=(_:_:)使用[Int]方法将数组附加到另​​一个类型数组:

var array1 = [1, 2, 3]
let array2 = [4, 5, 6]

array1 += array2
print(array1) // prints [1, 2, 3, 4, 5, 6]
Run Code Online (Sandbox Code Playgroud)

3.合并两个阵列与一个新的数组+=(_:_:)Array方法

Swift为append(contentsOf:)符合Array协议(包括append(contentsOf:))的所有类型提供了一种方法.append(contentsOf:)有以下声明:

mutating func append<S>(contentsOf newElements: S) where S : Sequence, Self.Element == S.Element
Run Code Online (Sandbox Code Playgroud)

返回一个数组,其中包含使用此序列的每个元素调用给定转换的连接结果.

以下Playground代码显示了如何[Int]使用append(contentsOf:)方法将两个类型的数组合并到一个新数组中:

var array1 = [1, 2, 3]
let array2 = [4, 5, 6]

array1.append(contentsOf: array2)
print(array1) // prints [1, 2, 3, 4, 5, 6]
Run Code Online (Sandbox Code Playgroud)

4.合并两个阵列与一个新的数组SequenceflatMap(_:)方法和flatMap(_:)Sequence初始值设定

Swift为Array符合flatMap(_:)协议(包括[Int])的所有类型提供了一种方法.flatMap(_:)有以下声明:

func flatMap<SegmentOfResult>(_ transform: (Self.Element) throws -> SegmentOfResult) rethrows -> [SegmentOfResult.Element] where SegmentOfResult : Sequence
Run Code Online (Sandbox Code Playgroud)

返回连接序列序列的元素.

此外,Swift Sequence还有一个joined()初始化程序.Array有以下声明:

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]
Run Code Online (Sandbox Code Playgroud)

创建一个包含序列元素的数组.

因此,以下Playground代码显示了如何init(_:)使用joined()method和Sequenceinitializer 将两个类型的数组合并到一个新数组中:

func joined() -> FlattenSequence<Self>
Run Code Online (Sandbox Code Playgroud)

5.合并两个阵列与一个新的数组Arrayjoined()方法

斯威夫特Array有一种init(_:)方法.init(_:)有以下声明:

init<S>(_ s: S) where Element == S.Element, S : Sequence
Run Code Online (Sandbox Code Playgroud)

返回使用此序列的每个元素和累积值调用给定组合闭包的结果.

以下Playground代码显示了如何[Int]使用joined()方法将两个类型的数组合并到一个新数组中:

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]
Run Code Online (Sandbox Code Playgroud)

  • 感谢分享这些代码,良好的解释,只是对你的答案的补充,如果你说哪一个更有效率的性能,那将是最好的? (4认同)

Maz*_*yod 30

如果您不是运算符重载的忠实粉丝,或者只是更多功能类型:

// use flatMap
let result = [
    ["merge", "me"], 
    ["We", "shall", "unite"],
    ["magic"]
].flatMap { $0 }
// Output: ["merge", "me", "We", "shall", "unite", "magic"]

// ... or reduce
[[1],[2],[3]].reduce([], +)
// Output: [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)


Tom*_*Bąk 19

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

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

let c = [a, b].flatten()
Run Code Online (Sandbox Code Playgroud)

这将返回FlattenBidirectionalCollection所以,如果你只是想要一个CollectionType就足够了,你将免费进行懒惰的评估.如果您需要完全相同的数组,您可以这样做:

let c = Array([a, b].flatten())
Run Code Online (Sandbox Code Playgroud)

  • `flatten()` 现在似乎不存在了。但是你可以考虑 [`joined()`](https://developer.apple.com/documentation/swift/array/2945737-joined)。 (4认同)

bla*_*acx 12

所以这个问题真的很急迫flatMap,不需要我们自己重新实现一些东西或者使用reduce:

var a:[CGFloat] = [1, 2, 3]
var b:[CGFloat] = [4, 5, 6]
let merged = [a, b].flatMap { $0 }
Run Code Online (Sandbox Code Playgroud)

就是这样 - 玩得开心


Umb*_*ndi 9

要完成可能的替代列表,reduce可以用来实现flatten的行为:

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

let res = [a, b].reduce([],combine:+)
Run Code Online (Sandbox Code Playgroud)

所呈现的最佳替代方案(性能/内存方面)很简单flatten,只是懒惰地包装原始数组而不创建新的数组结构.

但请注意,flatten 不返回 a LazyCollection,因此惰性行为不会传播到沿链的下一个操作(map,flatMap,filter等等).

如果lazyness你的具体情况是有道理的,只记得前面或后面附加一.lazyflatten(),例如,修改托马斯品尝这种方式:

let c = [a, b].lazy.flatten()
Run Code Online (Sandbox Code Playgroud)


Li *_*Jin 7

Swift 5 数组扩展

extension Array where Element: Sequence {
    func joined() -> Array<Element.Element> {
        return self.reduce([], +)
    }
}
Run Code Online (Sandbox Code Playgroud)

例子:

let array = [[1,2,3], [4,5,6], [7,8,9]]
print(array.joined())

//result: [1, 2, 3, 4, 5, 6, 7, 8, 9]
Run Code Online (Sandbox Code Playgroud)


Sto*_*tch 6

斯威夫特 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 :)
Run Code Online (Sandbox Code Playgroud)


Vit*_*lii 5

如果您希望在特定索引之后插入第二个数组,您可以这样做(从 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] 
Run Code Online (Sandbox Code Playgroud)