我創建了下面的函式,但我不知道如何呼叫它,它抱怨說:
Type 'T.Type' cannot conform to 'Decodable'
我想這樣稱呼它:
let result = getApiData(modelToDecode: MyModel, url: "abc")
這是我嘗試過的:
func getApiData<T : Decodable>(modelToDecode: T.Type, url: String) -> Any? {
// I get an error below
fetchDataAndDecode(url: String, modelToDecode: T.Type) { result in
}
// temp placeholder
return nil
}
func fetchDataAndDecode<T : Decodable>(url: String, modelToDecode: T.Type, completionHandler: @escaping (Result<T.Type, NetworkError>) -> Void) {
guard let url = URL(string: url) else {
completionHandler(.failure(NetworkError.badURL))
return
}
AF.request(url, method: .get).validate().responseData { response in
guard let data = response.data else {
completionHandler(.failure(NetworkError.apiFailed))
return
}
do {
// Decode the data
let decodedData = try JSONDecoder().decode(modelToDecode.self, from: data)
DispatchQueue.main.async {
completionHandler(.success(decodedData as! T.Type))
}
} catch(let error) {
print("?? Error on afRequest(): \(error)")
}
}
}
我怎樣才能在課堂上正確地呼叫它?
uj5u.com熱心網友回復:
結果應該是Result<T, NetworkError>。無需添加modelToDecode到您的方法宣告中。您可以在異步呼叫中顯式設定結果型別。順便說一句,如果您無法解碼資料,您也應該使用完成處理程式:
enum NetworkError: Error {
case badURL, apiFailed, corruptedData
}
您的方法應如下所示:
func fetchDataAndDecode<T: Decodable>(url: String, completionHandler: @escaping (Result<T, NetworkError>) -> Void) {
guard let url = URL(string: url) else {
completionHandler(.failure(.badURL))
return
}
AF.request(url, method: .get).validate().responseData { response in
guard let data = response.data else {
completionHandler(.failure(.apiFailed))
return
}
do {
let decodedData = try JSONDecoder().decode(T.self, from: data)
DispatchQueue.main.async {
completionHandler(.success(decodedData))
}
} catch {
completionHandler(.failure(.corruptedData))
}
}
}
呼叫它時,您需要顯式設定結果型別:
fetchDataAndDecode(url: "yourURL") { (result: Result<WhatEver, NetworkError>) in
// switch the result here
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/409134.html
標籤:
上一篇:SwiftUI:DatePicker/Date()格式化
下一篇:SWIFT“三級陣列”
