2016-05-02 8 views
0

例えば、私は構造体AdjacencyListを持っています。そこで、頂点が格納されているコンテナのタイプを指定して、重複したくない場合はユーザがSetを選択できるようにします。そうであればArrayを選択します。generic構造体/クラスのCollectionTypeを指定するにはどうすればよいですか?

(私のコード例はすでに間違っているので、タイプのプロトコル適合性は省略しました。多くの場合、コンテナタイプに応じて適合させる必要があります。例えば、SetエレメントはHashableです。

public struct AdjacencyList<VertexType, EdgeType, VertexContainerType, EdgeContainerType> { 
    var vertices: VertexContainerType<VertexType> 
    ... 
} 
+0

は、あなたがこれまでのことを実行しようとしました何をしたか私たちに示してください。 – Brduca

+0

あなたは正しいです、コンテナの種類に応じて多くのコードを準拠させる必要があります。このため、同じオブジェクトを 'Set'を介して順序付けし、' Array'を介して順序付けすることは望ましくないかもしれません。問題は、 'CollectionType'プロトコルが汎用的でないことです。 –

答えて

1

CollectionTypeは一般的ではありません。あなたが指摘している特定の問題を回避する方法の1つは、クライアントにコンテナタイプを指定させてから、実際の要素タイプを抽出することです。例えば

struct AdjacencyList<VertexContainerType: CollectionType, EdgeContainerType: CollectionType> { 

    var vertices: VertexContainerType 

    typealias VertexType = VertexContainerType.Generator.Element 

    typealias EdgeType = EdgeContainerType.Generator.Element 

    func printTypes() { 
     print("VertexType: \(VertexType.self)\nEdgeType: \(EdgeType.self)") 

    } 

} 

let a = AdjacencyList<Array<Int>, Array<Double>>(vertices: [Int]()) 

a.printTypes() 

// Prints: 
// VertexType: Int 
// EdgeType: Double 
関連する問題