2017-05-06 8 views
1

와 프로토콜을 확장 이 Result<Value> 일 때 PAT으로 확장되었지만 컴파일러가 Value을 결정할 수 없으므로 "일반 참조가 필요합니다"라는 컴파일 오류가 발생합니다.의 우리가 프로토콜을 정의한다고 가정 해 봅시다 일반적인 associatedtype

여기에 확장에 대한 코드입니다 :

extension Pat where Element == Result { 
} 
+0

좋은 질문입니다. 'where Element == Result '또는 뭔가를 할 수 있다고 생각하지만, Value 대신 generic을 유지하면서 결과 유형에 대해 수행 할 수 있는지 확신하지 못합니다. 하나의 옵션은 결과를 다른 프로토콜과 일치시키는 것입니다. 그러면'Element : OtherProto'라고 말할 수 있습니다. – jtbandes

+0

@jtbandes 옙'Result '은 작동하지만 다른 프로토콜을 따르는 것도 작동하지 않습니다. 어떤 경우에는 작동하지만 메서드 나 변수가 'Value'로 작업하기를 원한다면 실용적이지는 않습니다. it sais : "값은 구체적 또는 일반 매개 변수로만 사용할 수 있습니다." – farzadshbfn

+0

확장 프로그램에서 정확히 무엇을 하시겠습니까? – jtbandes

답변

2

이 솔루션은 그 안에 결과를 감싸는 associatedType와 다른 프로토콜을 만드는 것입니다.

protocol Resultable { 
    associatedType ValueType 
    var isSuccess: Bool { get } 
    var value: ValueType? { get } 
} 

및 결과가 Resultable을 확장합니다

extension Result: Resultable { 
    typealias ValueType = Value 
    var isSuccess: Bool { ... } 
    var value: ValueType? { ... } 
} 

Resultable를 사용하여 PAT을 확장 :

extension PAT where Element: Resultable { 
    // in here you have access to Resultable.ValueType 
} 

확실 쓰기 Element: Resultable하지 Element == Resultable을합니다. 이것이 제 코드가 처음에는 작동하지 않는 이유입니다.