首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自定义Moya插件

自定义Moya插件
EN

Stack Overflow用户
提问于 2019-07-29 12:48:09
回答 3查看 1.7K关注 0票数 1

我在创建自己的Moya插件时遇到了问题,下面的代码是这样的:

代码语言:javascript
复制
import Foundation
import Moya
import Result

public final class CustomPlugin: PluginType {

    public func willSend(_ request: RequestType, target: TargetType) {
        print("willSend")
    }

    public func didReceive(_ result: Result<Response, MoyaError>, target: TargetType) {
        print("didReceive")
    }
}

我从Xcode编译器得到以下错误:

泛型类型“结果”具有太多的类型参数(got 2,但预期为1)

我可以通过更改

代码语言:javascript
复制
public func didReceive(_ result: Result<Response, MoyaError>, target: TargetType)

代码语言:javascript
复制
public func didReceive(_ result: Swift.Result<Response, MoyaError>, target: TargetType)

但是,在进行此更改后,不会调用didReceive方法。

谁能告诉我怎么解决这个问题吗?

谢谢!

EN

回答 3

Stack Overflow用户

发布于 2019-07-29 13:18:35

在Moya中,结果被定义为泛型枚举。

代码语言:javascript
复制
enum Result<T>{
    case success(T)
    case failure(String)
}

其中泛型参数类型只能是一个,但结果是将两个参数应用于泛型。

票数 2
EN

Stack Overflow用户

发布于 2019-07-29 18:03:00

取决于您的Moya版本,有不同的可能性:

如果你用的是Moya 13*

我们为Result类型使用捆绑框架(您导入了该框架)。这可能与Swift自己的Result类型不匹配(这是一种不同的类型,因此您得到了警告)。

Result<Response, MoyaError>替换Swift.Result<Response, MoyaError>只表示您使用的是不同的Result类型,因此您实现的方法与Moya要求您实现的方法不同(而且您不会收到警告,因为来自PluginType的所有插件方法都是可选实现的)。

真正的解决方案应该是使用Result框架提供的Result类型,这意味着类似于以下内容:

代码语言:javascript
复制
public func didReceive(_ result: Result.Result<Response, MoyaError>, target: TargetType) {
    print("didReceive")
}

注意:如果它不起作用,那么检查是否有兼容的Result框架版本,并将其导入插件文件中。

如果您正在使用Moya 14.* (目前正处于alpha阶段):

很可能不导入Result,您应该很好:)

票数 1
EN

Stack Overflow用户

发布于 2020-04-26 16:26:25

只需导入插件文件中的结果就可以解决我的问题。

我认为这是因为编译器使用Swift.Result而不是第三方结果,所以它将执行默认的协议扩展。

我使用Xcode 11.3,Swift 5,Moya 13.0.1,结果4.1.0

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57254207

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档