应用 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)" }
例外情况:
就像 github
的 GET
申请:
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
,
简化能够有