Ios 类级别的泛型约束,并在方法中使用它,因为参数将获取无法调用的错误 协议请求{ associatedtype数据类型 func execute()->DataType } 类SomeApiRequestMock:ApiRequest{ typealias数据类型=字符串 func execute()->String{ 返回“1” } } 简单类{ func creatorMock(u请求:D)->D.DataType{ request.execute() } } 简单扩展,其中D:someapirestmock{ var请求:SomeApiRequestMock{ 返回SomeApiRequestMock() } var create:D.DataType{ creatorMock(请求) } }
我有这个Ios 类级别的泛型约束,并在方法中使用它,因为参数将获取无法调用的错误 协议请求{ associatedtype数据类型 func execute()->DataType } 类SomeApiRequestMock:ApiRequest{ typealias数据类型=字符串 func execute()->String{ 返回“1” } } 简单类{ func creatorMock(u请求:D)->D.DataType{ request.execute() } } 简单扩展,其中D:someapirestmock{ var请求:SomeApiRequestMock{ 返回SomeApiRequestMock() } var create:D.DataType{ creatorMock(请求) } },ios,swift,Ios,Swift,我有这个aprequest协议,并创建了一些符合这个aprequest协议的具体类。 然后我尝试在一些通用约束类Simple中使用它。编译器最初很高兴,直到我尝试在扩展中调用creatorMock:func。我会得到 我可以通过在方法中再次添加相同的约束来解决它,如 func-creatorMock(u-request:D)->D.DataType 但我不明白为什么会这样?任何人都可以帮助解释这里发生了什么?根据您的需要,有两种解决方案: 使用==而不是:更简单 extension Simpl
aprequest
协议,并创建了一些符合这个aprequest
协议的具体类。
然后我尝试在一些通用约束类Simple
中使用它。编译器最初很高兴,直到我尝试在扩展中调用creatorMock:
func。我会得到
我可以通过在方法中再次添加相同的约束来解决它,如
func-creatorMock(u-request:D)->D.DataType
但我不明白为什么会这样?任何人都可以帮助解释这里发生了什么?根据您的需要,有两种解决方案:
使用
==
而不是:
更简单
extension Simple,其中D==SomeAPIRequestMock{
否则,您需要将初始值设定项附加到协议中,或者更简单地说,附加到模拟协议中:
类SomeAPIRequestMock:APIRequest{
必需的init(){}
您还需要返回D,而不是其超类的实例
简单扩展,其中D:someapirestmock{
变量请求:D{.init()}
var create:D.DataType{creatorMock(请求)}
}
关于API
:“我认为您可以在忠实地再现问题的同时去掉这里的许多复杂性(关联类型、返回值、函数实现)。您认为如何?我认为发生这种情况是因为var-request:SomeApiRequestMock
正在返回“协议存在性”.Protocol existence,奇怪的是,不符合他们自己所代表的协议。非常感谢Jessy!这两个解决方案都很好。我只是不明白为什么第二个解决方案`扩展简单,其中D:SomeAPIRequestMock{var-request:D{.init()}var-create:D.DataType{creatorMock(request)}`works但not`var request:SomeApiRequestMock{return SomeApiRequestMock()}var create:D.DataType{creatorMock(request)}`在我看来都是合法的。为什么我的不起作用。试图找出背后的原因。我非常感谢你的解决方案。效果非常好
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)
}
}