Moya 书写简化思路: enum

Posted 邓轻舟

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Moya 书写简化思路: enum相关的知识,希望对你有一定的参考价值。

使用 Moya 做 ios 的网络请求,

项目中有一百多个网络请求方法,就建立对应的 enum 条目

其中 path 的填写,一般 case 下,再抄写一遍

"/" + String( 具体的 case )

长这样

public enum Xxx {
    case zen
    case userProfile(String)
    case userRepositories(String)
    // ...
    // 省略一百条 +
}


extension Xxx: TargetType {
    public var baseURL: URL { return URL(string: "https://api.xxx.com")! }
    public var path: String {
        switch self {
        case .zen:
            return "/zen"
        case .userProfile(let name):
            return "/userProfile"
        case .userRepositories(let name):
            return "/userRepositories"
        // ...
        // 省略一百条 +
        }
    }
    
    // ...
    // 还有好几项, header 、 task
    
}

本文通过 Mirror 特性,优化 path 的书写

这种情况下

即后端给的,就是 iOS 端使用的

( 毫无规律,则本文不适合 )

( 本文适合通常情况下 )

1, 对于简单的 enum 条目,不带关联值,associated values

extension Xxx{
    var magic: String{
        return "\\(self)"
    }
}

2, 对于带关联值的 enum 条目,含有 associated values


extension Xxx{
    var magic: String{
        let mirror = Mirror(reflecting: self)
        return mirror.children.first?.label ?? "gg"
    }
}

总结上述:


extension Xxx{
    var magic: String{
        let mirror = Mirror(reflecting: self)
        if let label = mirror.children.first?.label{
            return label
        }
        else{
            return "\\(self)"
        }
    }
}

path 就可以这样书写


     public var path: String {
        return "/\\(magic)"
    }

例外情况:

就像 githubGET 请求:

extension GitHub: TargetType {
    public var baseURL: URL { return URL(string: "https://api.xxx.com")! }
    public var path: String {
        switch self {
        case .userProfile(let name):
            "/users/\\(name.urlEscaped)"
        default:
            return "/\\(magic)"
            // 比起原来,有简化
        }
    }
    
    // ...
    // 还有好几项, header 、 task
    
}

小公司一般都是 POST,

简化可以有

以上是关于Moya 书写简化思路: enum的主要内容,如果未能解决你的问题,请参考以下文章

为什么要简化代码书写

为啥我的 C 代码片段不起作用?简化版可以。为 unsigned long long 传递不带 VA_ARGS 的 args

javaweb入门-----jsp概念

TypeScript: switch enum

RxSwift+Moya+Moya_ObjectMapper+MJRefresh,刷新失败?

iOS书写高质量代码之耦合的处理 干货!