如果在swift中创建了两个数组,就像这样:
var a:[CGFloat] = [1, 2, 3]
var b:[CGFloat] = [4, 5, 6]
如何将它们合并为[1,2,3,4,5,6]?
如果在swift中创建了两个数组,就像这样:
var a:[CGFloat] = [1, 2, 3]
var b:[CGFloat] = [4, 5, 6]
如何将它们合并为[1,2,3,4,5,6]?
当前回答
如果你正在处理大型序列,那么更有效的方法是使用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时,它就开始无缝地迭代第二个序列。
其他回答
您可以用+连接数组,构建一个新数组
let c = a + b
print(c) // [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
或者用+=将一个数组附加到另一个数组(或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]
使用Swift 5,根据您的需要,您可以选择以下六种方式中的一种来连接/合并两个数组。
# 1。使用array的+(_:_:)泛型运算符将两个数组合并为一个新数组
数组有一个+(_:_:)泛型运算符。+(_:_:)有以下声明:
通过连接集合和序列的元素来创建新集合。
static func + <Other>(lhs: Array<Element>, rhs: Other) -> Array<Element> where Other : Sequence, Self.Element == Other.Element
下面的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]
# 2。使用array的+=(_:_:)泛型运算符将数组的元素追加到现有数组中
数组有一个+=(_:_:)通用运算符。+=(_:_:)有如下声明:
将序列的元素追加到范围可替换的集合。
static func += <Other>(lhs: inout Array<Element>, rhs: Other) where Other : Sequence, Self.Element == Other.Element
下面的Playground示例代码展示了如何使用+=(_:_:)泛型运算符将类型为[Int]的数组的元素附加到现有数组中:
var array1 = [1, 2, 3]
let array2 = [4, 5, 6]
array1 += array2
print(array1) // prints [1, 2, 3, 4, 5, 6]
# 3。使用array的Append (contentsOf:)方法将一个数组追加到另一个数组
Swift Array有一个append(contentsOf:)方法。append(contentsOf:)有如下声明:
将序列或集合的元素添加到该集合的末尾。
mutating func append<S>(contentsOf newElements: S) where S : Sequence, Self.Element == S.Element
下面的Playground示例代码展示了如何使用append(contentsOf:)方法将一个数组追加到另一个类型为[Int]的数组:
var array1 = [1, 2, 3]
let array2 = [4, 5, 6]
array1.append(contentsOf: array2)
print(array1) // prints [1, 2, 3, 4, 5, 6]
# 4。使用Sequence的flatMap(_:)方法将两个数组合并为一个新数组
Swift为所有符合Sequence协议(包括Array)的类型提供了一个flatMap(_:)方法。flatMap(_:)有以下声明:
返回一个数组,其中包含使用该序列的每个元素调用给定转换的连接结果。
func flatMap<SegmentOfResult>(_ transform: (Self.Element) throws -> SegmentOfResult) rethrows -> [SegmentOfResult.Element] where SegmentOfResult : Sequence
下面的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]
# 5。使用Sequence的joined()方法和array的init(_:)初始化器将两个数组合并为一个新数组
Swift为所有符合Sequence协议的类型(包括Array)提供了一个joined()方法。Joined()有以下声明:
返回此序列序列的元素。
func joined() -> FlattenSequence<Self>
此外,Swift Array有一个init(_:)初始化项。Init(_:)有如下声明:
创建包含序列元素的数组。
init<S>(_ s: S) where Element == S.Element, S : Sequence
因此,下面的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]
# 6。使用array的reduce(_:_:)方法将两个数组合并为一个新数组
Swift Array有一个reduce(_:_:)方法。Reduce(_:_:)有如下声明:
返回使用给定闭包组合序列元素的结果。
func reduce<Result>(_ initialResult: Result, _ nextPartialResult: (Result, Element) throws -> Result) rethrows -> Result
下面的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]
如果你正在处理大型序列,那么更有效的方法是使用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时,它就开始无缝地迭代第二个序列。
类似地,使用数组字典可以:
var dict1 = [String:[Int]]()
var dict2 = [String:[Int]]()
dict1["key"] = [1,2,3]
dict2["key"] = [4,5,6]
dict1["key"] = dict1["key"]! + dict2["key"]!
print(dict1["key"]!)
如果“key”匹配,则可以遍历dict1并添加dict2
斯威夫特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]
这是上述代码的正确结果。