2017-07-28 159 views
0

的通用協議性能要求掙扎了一會兒有,這將是非常有益的,如果你可以在此提供一些線索:如何聲明在協議

我有一個APIWorkerProtocol具有性能要求,所需財產是一個協議,即DataParserProtocol

protocol APIWorkerProtocol { 
    var apiRequestProvider : APIRequestGeneratorProtocol {get} 
    var dataParser : DataParserProtocol{get} 
    func callAPI(completionHandler: @escaping (APICallResult<Self.ResultType>) -> Void) 
} 

protocol DataParserProtocol { 
    associatedtype ExpectedRawDataType 
    associatedtype ResultType 
    func parseFetchedData(fetchedData : ExpectedRawDataType) -> APICallResult<ResultType> 
} 

我該怎麼做到這一點?

在當前的實施中,這會導致錯誤Protocol 'DataParserProtocol' can only be used as a generic constraint because it has Self or associated type requirements

預先感謝

ANKIT

回答

1

如果協議化妝用途的Self或相關聯的類型的要求(均勻的協議),我們可以注意到使用的協議作爲具體類型。

因此,而不是使用DataParserProtocol作爲具體類型dataParser屬性(在APIWorkerProtocol blueprinted),你可以添加一個associatedtype typeholder,說DataParser,到APIWorkerProtocol,這被約束爲符合類型DataParserProtocol

而且,我不知道用的callAPI(...)完成處理器使用Self.ResultType作爲專業化的意圖是什麼(因爲Self將引用類型實施APIWorkerProtocol;其藍圖沒有associatedtypeResultType協議):你的意思要使用DataParserProtocol類型的ResultType

E.g.

protocol APIWorkerProtocol { 
    associatedtype DataParser: DataParserProtocol 
    var dataParser : DataParser { get } 
    func callAPI(completionHandler: @escaping (APICallResult<DataParser.ResultType>) -> Void) 
} 

protocol DataParserProtocol { 
    associatedtype ExpectedRawDataType 
    associatedtype ResultType 
    func parseFetchedData(fetchedData: ExpectedRawDataType) -> APICallResult<ResultType> 
} 
+0

你是絕對正確我的@dfri –