Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
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 - Fatal编程技术网

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)
    }
}