protocolMYRequest{ var router: String { get } var api: String { get }
associatedtypeT: Decodable// generics type }
extensionMYRequest{ var api: String { return"v1" }
var domain: String { return"https://domain.com" }
// T is used in DataResponse<T> funcrequest(completionHandler: @escaping (DataResponse<T>) -> Void) { let url ="\(domain)/\(api)/\(router)" Alamofire.request(url).responseDecodable(completionHandler: completionHandler) } }
现在,我们可以根据需要实现不同的 Requset:
1 2 3 4 5 6 7 8 9
structARequset: MYRequest{ let router ="a" typealiasT=A }
structBRequset: MYRequest{ let router ="b" typealiasT=B }
另外,我们可以定义另一个具有相同协议的协议 var api: String { get } 在 MYRequest 如果我们有一个新的 CRequset 和 API 升级到 v2
1 2 3 4 5 6 7 8 9 10 11
protocolV2{ var api: String { get } } extensionV2{ var api: String { return"v2" } }
structC: Request, V2{ let router ="c" typealiasT=C }
最后,ViewController 中的请求将如下所示:
1 2 3 4 5 6 7 8 9 10
ARequset().request { [weakself] response in iflet a = response.result.value { // a is A, not Any
} } BRequset().request { [weakself] response in iflet b = response.result.value { // b is B, not Any