如何在没有类型转换的情况下将 flatten 实现为 Array 的扩展?
Posted
技术标签:
【中文标题】如何在没有类型转换的情况下将 flatten 实现为 Array 的扩展?【英文标题】:How to implement flatten as an extension on an Array without type casting? 【发布时间】:2014-07-03 22:33:01 【问题描述】:extension Array
func flatten<T>() -> T[]
let xs = (self as Any) as Array<Array<T>>
return xs.reduce(T[](), +)
它有效,但我不确定是否需要所有这些演员表。
有没有更好的办法?
为了比较,here 是 swift 扩展库之一中的实现。我不确定他们是否也已经弄清楚了——他们的实施始于以下评论:
//这里还有一些工作要做
【问题讨论】:
如果它有效,那么它属于代码审查,如果它被破坏它属于这里 How can I extend typed Arrays in Swift?的可能重复 为什么您在至少 2 个堆栈交换网站上发布了这个相同的问题? 根本不需要实现flatten
。 reduce
已经是 flatten
。 join
也是如此。
【参考方案1】:
您不能在 Swift 中扩展泛型类型的特定类型:
extension Array<Int>
错误:无法扩展非标称类型“数组”
但是您可以编写一个采用特定类型数组的函数。如果您想展平一个数组数组(Array<T[]>
、T[][]
或 Array>),您的函数签名将如下所示:
func flatten<T> (array: Array<T[]>) -> T[]
它接受T
的数组并返回T
的数组。然后您可以将您的方法与reduce
一起使用:
func flatten<T> (array: Array<T[]>) -> T[]
return array.reduce(T[](), +)
【讨论】:
以上是关于如何在没有类型转换的情况下将 flatten 实现为 Array 的扩展?的主要内容,如果未能解决你的问题,请参考以下文章
如何在不使用 foreach 的情况下将 ArrayList 转换为强类型泛型列表?