gpt4 book ai didi

ios - 如何在 Swift 中使我的 Networking 类通用?

转载 作者:行者123 更新时间:2023-12-04 02:28:43 25 4
gpt4 key购买 nike

在这里,我将数据提取为 数据模型 .但是我想让这个类通用并自己传递模型,以便我可以使用它来解析来自多个 API 的数据。任何人都可以帮忙吗?

import Foundation

struct NetworkManager {
func fetchData(url : String, completion : @escaping (DataModel?) -> ()) {
print("Neeraj here")
let sessionURL = URL(string: url)
let session = URLSession(configuration: .default)
let dataTask = session.dataTask(with: sessionURL!) { (data, response, error) in
if error == nil {
if let safeData = data {
if let parsedData = self.parseData(data : safeData) {
print("got data")
completion(parsedData)
}
else {
debugPrint("failed to fetch data")
completion(nil)
}
}
}
else {
print("error in data task is \(String(describing: error))")
completion(nil)
}
}
dataTask.resume()

}

func parseData(data : Data) -> DataModel? {
let decoder = JSONDecoder()
do {
let decodedData = try decoder.decode(DataModel.self, from: data)
return decodedData
} catch {
print("error while parsing data \(error)")
return nil
}
}
}

最佳答案

用方便Result type 你可以写一个非常小的泛型方法,它在成功时返回解码的类型,在失败时返回任何错误

func fetchData<T: Decodable>(urlString: String, completion: @escaping (Result<T,Error>) -> Void) {
guard let url = URL(string: urlString) else { return } // or throw an error
URLSession.shared.dataTask(with: url) { (data, _, error) in
if let error = error { completion(.failure(error)); return }
completion( Result{ try JSONDecoder().decode(T.self, from: data!) })
}.resume()
}
注意:强制展开 data!如果没有错误发生,则是 100% 安全的

请注意,在调用方法时必须指定具体类型
fetchData(urlString: "https://example.com/api") { (result : Result<MyModel,Error>) in
switch result {
case .success(let model): print(model)
case .failure(let error): print(error)
}
}

关于ios - 如何在 Swift 中使我的 Networking 类通用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65576832/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com