2017-10-08 73 views
2

我有一個鏈表一類聲明如下:如何擴展通用類型的數組?

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 
    } 
} 

但是,這給出了T是未申報的錯誤。我試圖把它拿出來做其他事情,但沒有任何成效。

我能夠用在LinkedNode類的方法來得到相同的結果:

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

但我寧願一個數組初始化器,因爲許多其他的集合類型有初始化器。

回答

3

您可以在初始化程序定義中聲明一個通用參數。

extension Array { 

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

謝謝,就是這麼做的。而且你還證明你在初始化程序中執行self = result,而不是返回結果。 – MarkAurelius