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)
Ima*_*tit 121
使用Swift 3,根据您的需求和品味,您可以选择以下五种方法之一来连接/合并两个数组.
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)
+(_:_:)'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)
+=(_:_:)的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)
Sequence的flatMap(_:)方法和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)
Array的joined()方法斯威夫特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)
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)
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)
就是这样 - 玩得开心
要完成可能的替代列表,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你的具体情况是有道理的,只记得前面或后面附加一.lazy到flatten(),例如,修改托马斯品尝这种方式:
let c = [a, b].lazy.flatten()
Run Code Online (Sandbox Code Playgroud)
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)
斯威夫特 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)
如果您希望在特定索引之后插入第二个数组,您可以这样做(从 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)