如何在没有类型转换的情况下将 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 个堆栈交换网站上发布了这个相同的问题? 根本不需要实现flattenreduce 已经 flattenjoin 也是如此。 【参考方案1】:

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

extension Array<Int> 

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

但是您可以编写一个采用特定类型数组的函数。如果您想展平一个数组数组(Array&lt;T[]&gt;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 的扩展?的主要内容,如果未能解决你的问题,请参考以下文章

Postgresql 在没有时区的情况下将秒转换为时间

如何在不使用 foreach 的情况下将 ArrayList 转换为强类型泛型列表?

有没有办法在不知道派生类型的情况下将包含派生指针的 std::any 转换为基指针?

如何在没有副本的情况下将结构转换为字节数组?

如何在不使用不安全代码的情况下将float转换为二进制?

在不知道编码类型的情况下将 NSData 转换为 NSString