如何在协议中声明通用协议属性要求

时间:2017-07-28 08:42:53

标签: ios swift generics protocols

苦苦挣扎一段时间,如果你能对此有所了解,将会非常有帮助:

我有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 个答案:

答案 0 :(得分:1)

如果协议使用Self或相关类型要求(同质协议),我们可能会注意使用协议作为具体类型。

因此,您可以添加DataParserProtocol类型的所有者,而不是使用dataParser作为APIWorkerProtocol属性的具体类型(在associatedtype中进行蓝图),而不是DataParser 1}},APIWorkerProtocol被约束为符合 DataParserProtocol的类型。

另外,我不确定在Self.ResultType的完成处理程序中使用callAPI(...)作为特化的意图是什么(因为Self将引用实现{{1}的类型一个蓝图没有APIWorkerProtocol associatedtype)的协议:你的意思是使用ResultType类型的ResultType吗?

E.g。

DataParserProtocol