gpt4 book ai didi

ios - 具有通用解码类型的网络调用

转载 作者:行者123 更新时间:2023-12-01 19:50:31 24 4
gpt4 key购买 nike

我正在尝试创建一个通用网络功能我正在寻找一个 API 处理程序,该处理程序将从网络下载 JSON 并将主题转换为符合 Decodable 的 Swift 结构协议(protocol)。目前我正在使用显式类型:

struct MyObject : Decodable {
let id : Int
let name : String
}

static fileprivate func makeNetworkRequest(url: URL, completionHandler: @escaping(_ error: Error?, _ myObject: MyObject?) -> ()) {
URLSession.shared.dataTask(with: url) { (data, response, error) in
// handle error
do {
let myNewObject = try JSONDecoder().decode(MyObject.self, from: data!)
completionHandler(nil, myNewObject)
}
catch let error {
completionHandler(error, nil)
return
}
}.resume()
}

我希望创建一个通用函数,我可以在其中指定任何确认到 Decodable 的数据类型并在完成处理程序中返回数据对象。类似于以下内容:
static fileprivate func makeNetworkRequest<T>(url: URL, type: <<<Decodable Type>>>, completionHandler: @escaping(_ error: Error?, _ myObject: <<<Deocable Object>>>?) -> ()) {
URLSession.shared.dataTask(with: url) { (data, response, error) in
// handle error
do {
let myNewObject = try JSONDecoder().decode(<<<Decodable Type>>>.self, from: data!)
completionHandler(nil, myNewObject)
}
catch let error {
completionHandler(error, nil)
return
}
}.resume()
}

但是,我似乎无法正确获取函数参数。我没有很多使用泛型的经验。任何帮助,将不胜感激

最佳答案

您可以模仿 decode 的声明JSONDecoder的方法:

open func decode<T>(_ type: T.Type, from data: Data) throws -> T where T : Decodable

将上面的模式应用到您的代码中,定义应该是这样的:
static fileprivate func makeNetworkRequest<T>(url: URL, type: T.Type, completionHandler: @escaping (_ error: Error?, _ myObject: T?) -> ())
where T: Decodable
{
URLSession.shared.dataTask(with: url) { (data, response, error) in
// handle error
do {
let myNewObject = try JSONDecoder().decode(T.self, from: data!)
completionHandler(nil, myNewObject)
} catch let error {
completionHandler(error, nil)
return
}
}.resume()
}

或者你可以这样写:
static fileprivate func makeNetworkRequest<T: Decodable>(url: URL, type: T.Type, completionHandler: @escaping (_ error: Error?, _ myObject: T?) -> ()) {
URLSession.shared.dataTask(with: url) { (data, response, error) in
// handle error
do {
let myNewObject = try JSONDecoder().decode(T.self, from: data!)
completionHandler(nil, myNewObject)
} catch let error {
completionHandler(error, nil)
return
}
}.resume()
}

关于ios - 具有通用解码类型的网络调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46259959/

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