protocol ApiRequest {
associatedtype DataType
func execute() -> DataType
}
class SomeApiRequestMock: ApiRequest {
typealias DataType = String
func execute() -> String {
return "1"
}
}
class Simple<D: ApiRequest>{
func creatorMock(_ request: D) -> D.DataType {
request.execute()
}
}
extension Simple where D: SomeApiRequestMock {
var request: SomeApiRequestMock {
return SomeApiRequestMock()
}
var create: D.DataType {
creatorMock(request)
}
}我有这个ApiRequest协议,并创建了一些符合这个ApiRequest协议的具体类。然后,我尝试在一些通用约束类Simple中使用它。编译器一开始很高兴,直到我尝试在扩展中调用creatorMock: func。我会得到

我可以通过在像func creatorMock<D: ApiRequest>(_ request: D) -> D.DataType这样的方法中再次添加相同的约束来解决这个问题。
但我不明白这是为什么?谁能帮我解释一下这是怎么回事?
发布于 2020-03-10 00:21:03
根据您的需要,有两种解决方案:
使用==而不是:更简单。
extension Simple where D == SomeAPIRequestMock {否则,您需要在您的协议中附加一个初始化程序,或者,更简单地说,您的模拟:
class SomeAPIRequestMock: APIRequest {
required init() { }您还需要返回D,而不是它的超类的实例。
extension Simple where D: SomeAPIRequestMock {
var request: D { .init() }
var create: D.DataType { creatorMock(request) }
}https://stackoverflow.com/questions/60609169
复制相似问题