2016-07-03 6 views
1

제너릭 멤버를 generic으로 저장하는 컬렉션을 만들고 싶습니다. 이 작업을 수행하는 데 올바른 구문은 무엇입니까? 내가 할 노력하고있어 횡단하려는 시도에서, 가장에 의해 추측은 다음과 같습니다 : AdjacencyList의 새로운 인스턴스를 생성 할 때제네릭 클래스에 제네릭 컬렉션 형식을 지정하려면 어떻게합니까?

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'은 어디서 오는가? 그것들은 커스텀 콜렉션 타입입니까, 아니면 각각의 타입의'Set' 또는'Array'라고합시다? –

+0

나는'Array'와'Set'을 사용할 것을 기대했지만, 찾고있는 솔루션 코드는'Collection' 프로토콜을 따르고 하나의 일반적인 타입 매개 변수를 받아들이는 커스텀 타입을 수용 할 수 있다고 믿습니다. 어떻게 든 '사전 (Dictionary)'을 수용 할 수 있다는 것은 깔끔할 것입니다.하지만 두 가지 유형 매개 변수가 필요하기 때문에 질문의 범위를 벗어날 수 있다고 생각합니다. –

답변

1

당신이 사용자 지정 컬렉션 형식을 사용하고 있는지 또는 당신이 원하는 여부에 따라하는 것은 그들을 지정 당신이 비슷한 멀리 얻을 수 있습니다 또는 당신이 수집 유형, (코드가 스위프트 3에 이와 비슷한 일을 할 수있는 모든 시간을 지정할 수 있도록하려면

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

, 그래서 VC.Iterator.Element는해야한다 VC.Generator.ElementCollectionCollectionType이됩니다. 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) –

관련 문제