如何在不进行类型转换的情况下实现扁平化作为数组的扩展?

fuz*_*uzz 4 arrays generics swift

extension Array {
  func flatten<T>() -> T[] {
    let xs = (self as Any) as Array<Array<T>>
    return xs.reduce(T[](), +)
  }
}
Run Code Online (Sandbox Code Playgroud)

它有效,但我不确定是否需要所有这些转换。

有没有更好的办法?

为了进行比较,这里是 swift 扩展库之一中的实现。我不确定他们是否也已经弄清楚了——他们的实施始于以下评论:

// 这里还有一些工作要做

Seb*_*ian 5

你不能在 Swift 中扩展泛型类型的特定类型:

extension Array<Int> {
}
Run Code Online (Sandbox Code Playgroud)

错误:非标称类型“Array”无法扩展

但是您可以编写一个采用特定类型数组的函数。如果您想展平数组的数组(Array<T[]>T[][]Array>),您的函数签名将如下所示:

func flatten<T> (array: Array<T[]>) -> T[]
Run Code Online (Sandbox Code Playgroud)

它接受一个数组的数组T并返回一个数组T。然后您可以使用您的方法reduce

func flatten<T> (array: Array<T[]>) -> T[] {
    return array.reduce(T[](), +)
}
Run Code Online (Sandbox Code Playgroud)