Arrays 如何在Swift中快速展平阵列?

Arrays 如何在Swift中快速展平阵列?,arrays,swift,flatten,Arrays,Swift,Flatten,我想把这个转变为: let x = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] 为此: [1, 2, 3, 4, 5, 6, 7, 8, 9] 非常优雅 当然,最直接的方法是 var y = [Int]() x.forEach { y.appendContentsOf($0) } 但这使得生成的数组是可变的,这是不必要的。我不喜欢这样 我尝试使用reduce: let y = x.reduce([Int]()) { (array, ints) -> [Int]

我想把这个转变为:

let x = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
为此:

[1, 2, 3, 4, 5, 6, 7, 8, 9]
非常优雅

当然,最直接的方法是

var y = [Int]()
x.forEach { y.appendContentsOf($0) }
但这使得生成的数组是可变的,这是不必要的。我不喜欢这样

我尝试使用
reduce

let y = x.reduce([Int]()) { (array, ints) -> [Int] in
    array.appendContentsOf(ints)
    return array
}
但是编译器抱怨
array
是不可变的,所以我不能调用mutating方法
appendContentsOf

因此,我添加了一些内容:

let y = x.reduce([Int]()) { (array, ints) -> [Int] in
    var newArr = array
    newArr.appendContentsOf(ints)
    return newArr
}
这太糟糕了。我有一种直觉,这不是很快


如何比上述方法更快速地展平阵列?一行程序就好了。

有一个内置的函数,叫做:

(请注意,这实际上并不返回另一个数组,而是返回一个
flattSequence
,但这通常并不重要,因为它仍然是一个序列,可以与
一起用于
循环等等。如果您真的在意,可以使用
数组(arrayOfArrays.joined())


这也可以帮助你。它的签名大概是,

flatMap<S: SequenceType>(fn: (Generator.Element) -> S) -> [S.Generator.Element]

数组中的展平函数:

let x = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
let y = Array(x.flatten())
print(y)
let x = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
let y = x.flatMap({$0})
print(y)
数组中的flatMap函数:

let x = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
let y = Array(x.flatten())
print(y)
let x = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
let y = x.flatMap({$0})
print(y)
您的输出:

let x = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
let y = Array(x.flatten())
print(y)
let x = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
let y = x.flatMap({$0})
print(y)


更多信息:

使用Swift 5,您可以选择以下三种方法之一来展平阵列


#1.使用
array
flatMap(:)
方法展平数组 使用Swift,符合
序列
协议的类型(包括
数组
)具有
平面映射(:)
方法<代码>数组具有以下声明:

func flatMap<SegmentOfResult>(_ transform: (Element) throws -> SegmentOfResult) rethrows -> [SegmentOfResult.Element] where SegmentOfResult : Sequence
func joined() -> FlattenSequence<Array<Element>>
func reduce<Result>(_ initialResult: Result, _ nextPartialResult: (Result, Element) throws -> Result) rethrows -> Result

#2.使用
array
joined()
方法展平数组
Array
的方法名为
joined()
。有以下声明:

func flatMap<SegmentOfResult>(_ transform: (Element) throws -> SegmentOfResult) rethrows -> [SegmentOfResult.Element] where SegmentOfResult : Sequence
func joined() -> FlattenSequence<Array<Element>>
func reduce<Result>(_ initialResult: Result, _ nextPartialResult: (Result, Element) throws -> Result) rethrows -> Result

#3.使用
array
reduce(::)
方法展平数组 Swift
Array
具有具有以下声明的方法:

func flatMap<SegmentOfResult>(_ transform: (Element) throws -> SegmentOfResult) rethrows -> [SegmentOfResult.Element] where SegmentOfResult : Sequence
func joined() -> FlattenSequence<Array<Element>>
func reduce<Result>(_ initialResult: Result, _ nextPartialResult: (Result, Element) throws -> Result) rethrows -> Result
作为
reduce(::)
的替代方法,您可以使用:


您只需要使用2函数就可以做到这一点

  • 加入()

  • 压缩图

    设y=x.compactMap{$0}.joined().compactMap{$0}


  • 哦,我明白了!我以前看过
    flatMap
    。但是我看错了-
    flatMap(transform:([Int])->T?throws->[T]
    。我想知道“这和地图有什么不同?”现在我明白了。非常感谢。对平面图有多种类型。去读一读关于单子的书,你可能会明白为什么他们有相同的名字:-)很高兴知道!我认为我们必须在循环之前强制转换类型,很高兴看到我们没有:)Swift中的数组结构上没有展平方法,而是连接方法。可能是