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)"
}
例外情况:
就像 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
,
简化可以有
以上是关于Moya 书写简化思路: enum的主要内容,如果未能解决你的问题,请参考以下文章
为啥我的 C 代码片段不起作用?简化版可以。为 unsigned long long 传递不带 VA_ARGS 的 args