应用 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
,
简化能够有