2017-10-08 6 views
2

は、私がリンクリストのクラスは次のように宣言している:私は何をしたいリンクされたノードの配列に私のLinkedNodeクラスを変換初期化子を持つようにアレイを拡張ジェネリック型の配列を拡張するには?

class LinkedNode<T> { 

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


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

です。私はこれを試しました:

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 =結果を出すことも実証しました。 – MarkAurelius

関連する問題