我有一个链接列表类,声明如下:

 class LinkedNode<T> {

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


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

我要做的是将数组扩展为具有将LinkedNode类转换为链接节点数组的初始化器。我试过这个:
extension Array where Element == LinkedNode<T> {

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

但这会产生未声明的错误。我试过把它拿出来做其他的事情,但什么都没用。
我可以用LinkedNode类上的方法得到相同的结果:
    func array() -> [LinkedNode<T>]
    {
        var result = [LinkedNode<T>]()
        traverseList { result.append($0) }
        return result
    }

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

最佳答案

可以在初始值设定项定义中声明泛型参数。

extension Array {

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

关于arrays - 如何扩展泛型类型的数组?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46626775/

10-15 18:06