2016-07-03 285 views
1

說我正在創建一個泛型類,我也想使通用成員以通用方式存儲的集合。這樣做的正確語法是什麼?在試圖越過我想要做的就是,通過最好的猜測是如下:如何爲泛型類指定泛型集合類型?

class AdjacencyList<VertexType, EdgeType, VertexCollectionType: Collection, EdgeCollectionType: Collection> { 
    var vertices: VertexCollectionType<Vertex<VertexType>> 
    var edges: EdgeCollectionType<Edge<EdgeType>> 

    init() { 
     self.vertices = VertexCollectionType<VertexType>() 
     self.edges = EdgeCollectionType<EdgeType>() 
    } 
} 

class Vertex<VertexType> { ... } 
class Edge<EdgeType> { ... } 
+0

其中'EdgeCollectionType'和'VertexCollectionType'來自哪裏?他們是自定義集合類型還是讓我們說'相對類型的'集合'或'數組'? –

+0

我期望使用'Array'和'Set',但我相信我所尋找的解決方案代碼將能夠適應任何符合'Collection'協議的自定義類型並接受一個泛型類型參數。能夠以某種方式容納'Dictionary'會很整潔,但是因爲這需要兩個類型參數,所以我覺得它會超出問題的範圍。 –

回答

1

根據您是否使用自定義集合類型,還是你想創造AdjacencyList新實例時指定它們,你可以逃脫類似於:

class Vertex<VertexType> { } 

class Edge<EdgeType> { } 

class AdjacencyList<VertexType, EdgeType> { 
    var vertices: [Vertex<VertexType>] = [] 
    var edges: [Edge<EdgeType>] = [] 
} 

let list = AdjacencyList<String, Int>() 
list.vertices // [Vertex<String>] 
list.edges // [Edge<Int>] 

或者,如果你希望能夠指定每一次,你可以做一些類似這樣(的代碼是在雨燕3一些集合類型,所以VC.Iterator.ElementVC.Generator.ElementCollection變成CollectionType如果您使用Swift 2)

class AdjacencyList <V, E, VC: Collection, EC: Collection 
    where VC.Iterator.Element == Vertex<V>, EC.Iterator.Element == Edge<E>> { 

    var vertices: VC 
    var edges: EC 

    init(vertices: VC, edges: EC) { 
     self.vertices = vertices 
     self.edges = edges 
    } 
} 

let arrayList = AdjacencyList<String, Int, Array<Vertex<String>>, Array<Edge<Int>>>(vertices: [], edges: []) 
arrayList.vertices // [Vertex<String>] 
arrayList.edges // [Edge<Int>] 

// as long as Vertex and Edge are Hashable 
let setList = AdjacencyList<String, Int, Set<Vertex<String>>, Set<Edge<Int>>>(vertices: [], edges: []) 
setList.vertices // Set<Vertex<String>> 
setList.edges // Set<Edge<Int>> 
+0

你使用where聲明的第二個代碼看起來正是我所期待的。但是,在使用Swift 3時,我收到了一個'_.Iterator.Element'的語法錯誤,但是我看到了很多其他的迭代器類型。類型可能已經改變了? –

+0

我實際上是在Xcode 8 Swift 3遊樂場裏組裝了這個樣本。你使用的是哪個版本的Xcode? –

+0

版本8.0測試版(8S128d) –