【问题标题】:How to extend Array for generic type?如何为泛型类型扩展 Array?
【发布时间】:2018-03-19 12:02:40
【问题描述】:

我有一个这样声明的链表类:

 class LinkedNode<T> {

    let data: T
    var next: LinkedNode<T>?


    func traverseList(process: (LinkedNode<T>) -> ()) { ... }
}

我想要做的是扩展 Array 以拥有一个初始化程序,将我的 LinkedNode 类转换为链接节点数组。我试过这个:

extension Array where Element == LinkedNode<T> {

  init(node: LinkedNode<T>)
  {
      var result = [LinkedNode<T>]()
      traverseList { result.append($0) }
      return result
  }
}

但这会给出未声明 T 的错误。我曾尝试将其取出并做其他事情,但没有任何效果。

我能够使用 LinkedNode 类上的方法获得相同的结果:

    func array() -> [LinkedNode<T>]
    {
        var result = [LinkedNode<T>]()
        traverseList { result.append($0) }
        return result
    }

但我更喜欢数组初始化器,因为许多其他集合类型都有该初始化器。

【问题讨论】:

    标签: arrays swift generics swift4 initializer


    【解决方案1】:

    你可以在初始化器定义中声明一个泛型参数。

    extension Array {
    
        init<T>(node: LinkedNode<T>)
            where Element == LinkedNode<T>
        {
            var result = [LinkedNode<T>]()
            node.traverseList { result.append($0) }
            self = result
        }
    }
    

    【讨论】:

    • 谢谢,成功了。而且您还证明了您在初始化程序中执行 self = result,而不是返回结果。
    猜你喜欢
    • 2018-05-13
    • 2011-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多