2016-07-15 1 views
0

나는이 프로토콜 정의가 :프로토콜과 where 절을 사용하여 CollectionType을 확장하는 방법은 무엇입니까?

protocol BarChartDataConvertible { 
    var barChartData: BarChartData { get } 
} 

을 그리고 그 프로토콜로, 요소가 특정 유형의되는 CollectionType을 연장하고 싶습니다 :

extension CollectionType where Generator.Element == DataPoint { 

    // This works, by I also want it to be enforced by the BarChartDataConvertible 
    // var barChartData: BarChartData { ... } 

} 

내가 어떻게 할 수 있습니까?

[DataPoint(), DataPoint()].barChartData 
+0

질문이 * "해당 요소가 P"*를 준수하면 콜렉션을 프로토콜 P와 일치시킬 수 있습니까? 그렇다면 대답은 다음과 같습니다. 현재로서는 그렇게 할 수 없습니다. –

+0

닫기, 아니요. 질문은 : 요소가 Type DataPoint이고 프로토콜을 준수하는 콜렉션을 확장 할 수 있습니까? 나는 더 나은 설명을 위해 질문을 편집했다. – nmdias

+1

"프로토콜에 조건부 적합성"을 선언 할 수 없습니다. 그러나 'var barChartData : BarChartData {return someThingUsefulHere}'를 사용하면 위의 코드를 컴파일해야합니다. –

답변

1

당신은 일반적인 자리

extension CollectionType where Generator.Element == DataPoint { 
    var barChartData: BarChartData { return somethingUseful } 
} 

다음

[DataPoint(), DataPoint()].barChartData 

컴파일의 제한 유형에만 적용되는 확장 메서드를 정의 할 수 있습니다. 하지만 당신은 [swift-evolution] [Manifesto] Completing Generics에서 시작

extension CollectionType: DataPoint where Generator.Element == DataPoint { ... } 
이러한 기능은 신속한 진화 메일 링리스트에 설명되어 있습니다

, 로, " 프로토콜에 조건 준수"등을를 선언 할 수 없습니다 :

* 조건부 conformances

조건부 준수는 특정 유형에서만 이 특정 프로토콜을 준수한다는 개념을 나타냅니다.

확장 배열 : 요소가 Equatable 경우에만 예를 들어, 배열 Equatable입니다 Equatable {}

하지만 스위프트 2에서 사용할 수 없습니다와 - 지금까지 내가 볼 수 있습니다 : 요소가 Equatable - 스위프트 3에 대한 제안 목록이 현재 https://github.com/apple/swift-evolution에 없습니다.