我試圖在函式中傳遞一個模型/結構作為引數,并將其傳遞給另一個具有通用型別的結構/模型,下面是我的代碼
---> 函式
func getAPICallModelDecodable<T: Codable> (url:String,model:T,
success。@escaping (_ responseObject:T? )->Void,
failure。@escaping (_錯誤:String) -> Void ,
method:HTTPMethod = .get) {
print(type(of: model)
AF.request(url,method:method).responseDecodable(of: FetchAPI<T(Want to pass model parameter here) >.self) { respons in
print(respons)
switch respons.result {
case .success(let data)。
if data.flag! {
success(data.data)
}
case .fail(let error):
failure(error.localizedDescription)
}
}
}
----> FetchAPI結構
。struct FetchAPI<T: Codable>:Codable {
var flag: Bool?
var statusCode: Int?
var message: String?
var data: T?
enum CodingKeys。String, CodingKey {
case flag = "Flag"
case statusCode = "StatusCode"
case message = "Message"
case data = "Data" >。
}
}
模型引數可以是任何可編碼的結構
uj5u.com熱心網友回復:
目前你的函式getAPICallModelDecodable是這樣定義的,你必須傳入一個T型的模型。但如果我理解正確的話,你只想傳入(定義)型別T。
為此,你必須對該函式進行如下修改:
func getAPICallModelDecodable<T: Codable>(url: String, type: T.Type,
success。@escaping (_ responseObject:T? )->Void。
failure。@escaping (_錯誤:String) -> Void ,
method:HTTPMethod = .get)
在函式體中,你可以使用T,例如,簡單地像這樣:
在函式體中,你可以使用T。
AF.request(url,method:method).responseDecodable(of: FetchAPI<T>.self)
然后函式呼叫將看起來像這樣:
getAPICallModelDecodable(url: ..., type: Model.self, ...)
uj5u.com熱心網友回復:
你不需要明確地傳遞模型或模型的型別,編譯器可以從你呼叫方法時推斷出這些。
所以你的func宣告應該是
func getAPICallModelDecodable<T: Codable>(url:String,
success: @escaping (_ responseObject: T? -> Void,
failure。@escaping (_ error: String) -> Void ,
method:HTTPMethod = .get) {
而請求的呼叫應該是
AF.request(url,method:method).responseDecodable(of: FetchAPI<T>.self)
我自己不使用Alamofire,所以這里有一個更完整的例子,使用URLSession和符合Codable的模型Test快速實作。
func makeApiCall<T: Codable>(url: URL,
success: @escaping (_ responseObject: T? -> Void,
failure。@escaping (_ error: String) -> Void) {
let request = URLRequest(url: url)
URLSession.shared.dataTask(with: request) { (data, response, error) in
if let error = error {
failure("(error)")
}
if let data = data {
do {
let result = try JSONDecoder() 。 decode(FetchAPI<T>.self, from: data)
成功(result.data)
} catch {
failure("(錯誤)")
}
} else {
failure("沒有錯誤,沒有資料")
}
}
.恢復()
}
func success(_ model: Test?) {}
func failure(_ error: String) {}
let url = URL(string: "http://someurl")!
makeApiCall(url: url, success: { success($0) }, failure: { failure($0) })
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/318602.html
標籤:
