【问题标题】:How to implement flatten as an extension on an Array without type casting?如何在没有类型转换的情况下将 flatten 实现为 Array 的扩展?
【发布时间】: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 扩展库之一中的实现。我不确定他们是否也已经弄清楚了——他们的实施始于以下评论:

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

【问题讨论】:

  • 如果它有效,那么它属于代码审查,如果它被破坏它属于这里
  • 为什么您在至少 2 个堆栈交换网站上发布了这个相同的问题?
  • 根本不需要实现flattenreduce 已经 flattenjoin 也是如此。

标签: arrays swift generics


【解决方案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[](), +)
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-05
    • 1970-01-01
    • 2014-03-03
    • 2022-06-15
    • 1970-01-01
    • 2020-03-01
    相关资源
    最近更新 更多