我正在使用 Alamofire 來獲取資料。URLRequestConvertible 協議用于構造請求。當通過 Alamofire 在請求的類函式中呼叫 URLRequestConvertible 列舉時,我收到一個錯誤,如(Invalid conversion from throwing function of type '(AFDataResponse) throws -> Void' (aka '(DataResponse<Any, AFError>) throws -> ()') 到非拋出函式型別 '(AFDataResponse) -> Void' (aka '(DataResponse<Any, AFError>) -> ( )')).在請求的函式中,我正在獲取結果如何使用泛型?Q1:獲取結果時出錯 Q2:如何在函式中使用泛型
URLRequestConvertible 列舉:
enum Router: URLRequestConvertible{
case getAllDishes
var bseUrl : URL{
return URL(string: "https://yummie.glitch.me/")!
}
var method: HTTPMethod{
switch self {
default:
return .get
}
}
var path:String{
switch self{
case .getAllDishes:
return "dish-categories"
}
}
func asURLRequest() throws -> URLRequest {
let url = bseUrl.appendingPathComponent(path)
var request = URLRequest(url: url)
request.method = method
return request
}
}
呼叫請求的函式:
class NetworkLayer{
class func requested(_ request:Router,completion:@escaping(Result<Data,Error>) -> Void){
ProgressHUD.show() //if response comes that loader run
AF.request(request).responseJSON{ (response) in
switch response.result{
case .success(let data):
do{
let getDishesData = data as? [String:Any]
let resp = try JSONSerialization.data(withJSONObject: getDishesData?["data"], options: .prettyPrinted)
completion(.success(response))
}
case .failure(let error):
completion(.failure(error))
}
}
}

uj5u.com熱心網友回復:
您需要添加 Do-Catch 陳述句
catch – 如果 throwing 方法失敗并引發錯誤,則執行將落入此 catch 塊。
class NetworkLayer{
class func requested(_ request:Router,completion:@escaping(Result<Data,Error>) -> Void){
ProgressHUD.show() //if response comes that loader run
AF.request(request).responseJSON{ (response) in
switch response.result{
case .success(let data):
do{
let getDishesData = data as? [String:Any]
let resp = try JSONSerialization.data(withJSONObject: getDishesData?["data"], options: .prettyPrinted)
completion(.success(response))
}catch{
print(error)
completion(.failure(error))
}
case .failure(let error):
completion(.failure(error))
}
}
}
}
在這里給你的另一個建議是不需要做 JSONSerialization,因為 responseJSON 給你直接回應(Alamofire 會做 JSONSerialization)。
最終代碼
class NetworkLayer{
class func requested(_ request:Router,completion:@escaping(Result<Data,Error>) -> Void){
ProgressHUD.show() //if response comes that loader run
AF.request(request).responseJSON{ (response) in
switch response.result{
case .success(let response):
do{
print(response)
completion(.success(response))
}catch{
print(error)
completion(.failure(error))
}
case .failure(let error):
completion(.failure(error))
}
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/313642.html
