如何在没有类型转换的情况下将flatten实现为Array的扩展?

时间:2014-07-03 22:33:01

标签: arrays swift generics

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

它有效,但我不确定是否所有这些演员都是必需的。

有更好的方法吗?

为了进行比较,here是其中一个swift扩展库中的实现。我不确定他们是否也已经弄明白了 - 他们的实现始于以下评论:

  

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

1 个答案:

答案 0 :(得分:4)

您无法在Swift中扩展特定类型的泛型类型:

extension Array<Int> {
}
  
    

错误:非标称类型&#39;数组&#39;不能延长

  

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

func flatten<T> (array: Array<T[]>) -> T[]

它需要一组T数组,并返回一个T数组。然后,您可以使用reduce

的方法
func flatten<T> (array: Array<T[]>) -> T[] {
    return array.reduce(T[](), +)
}