我的结构名为APIManager。这个结构可以调用一些API并返回它们的值。这是如何组织的:
struct APIManager {
public static func checkEmail(_ email: String, success: @escaping (_ status: String) -> Void, failure: @escaping FailureBlock) {
Alamofire
.request(Router.LoginProcess.checkEmail(email: email))
.validate()
.responseJSON { (response: DataResponse<Any> ) in
switch response.result {
case .success(_):
if let value = response.result.value {
let json = JSON(value)
let userStatus = User.Status(rawValue: json["status"].intValue)
success(userStatus ?? User.Status.unknown)
}
break
case .failure(let error):
failure()
break
}
}
}
public static func block(
reason: User.BlockReason,
success: @escaping () -> Void,
failure: @escaping FailureBlock) {
Alamofire
.request(Router.LoginProcess.block(reason: reason))
.validate()
.responseJSON { (response: DataResponse<Any> ) in
switch response.result {
case .success(_):
success()
break
case .failure(_):
failure()
break
}
}
}
}
正如您所看到的,可以重用大部分代码来创建名为call(_ api: API.Type)
的方法,但问题出在success
块中,因为每个方法都有所不同。我怎样才能达到如下结果?
public static func call(_ api: API.Type, success: GenericSuccessBlock, failure: FailureBlock) {
...
}
根据GenericSuccessBlock
typealias
参数,使用声明为api
的块来输入enum
的位置。