应用 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,

简化能够有