【发布时间】:2019-02-20 16:23:44
【问题描述】:
我有一些 Swift 基础知识,现在我正在尝试学习 iOS 开发。我目前正在一个小型应用程序中工作,该应用程序将询问我制作的 API 上的资源,该 API 返回由以下内容制成的 json:
struct A : Codable {
let name: String
let age: Int
}
struct B : Codable {
let something: String
}
API 和应用程序都定义了这些结构。由于我总是在查询同一个 API,因此我想包装向 API 询问一些资源并对其进行解码的部分,以便在回调中使用该结构的实例。这是这个方法:
static func getContent(urlRequest: URLRequest, decodable: Decodable, completion: @escaping (Codable?, ErrorEnum?)->Void) {
let config = URLSessionConfiguration.default
let session = URLSession(configuration: config)
let task = session.dataTask(with: urlRequest) {
data, response, error in
guard let data = data else {
completion(nil, .noData) // Handling errors in an enum
return
}
let decoder = JSONDecoder()
if let full = try? decoder.decode(decodable, from: data) {
completion(full, nil)
}
}
task.resume()
}
我的问题与可解码参数有关。这显示错误并阻止我编译应用程序。在 StackOverflow 上找到一些资源后,我尝试将参数更改为
static func getContent(urlRequest: URLRequest, decodable: Decodable.Type, completion: @escaping (Codable?, ErrorEnum?)->Void)
我也尝试保持这样的参数,而是在解码参数内部进行更改
if let full = try? decoder.decode(decodable, from: data) {
completion(full, nil)
}
但似乎没有什么能让编译器满意...查看 Swift 源代码中的 decode 方法并没有太大帮助,因为它需要 T.Type where T is Decodable
我的愿望是能够按如下方式使用它:
static func getA() {
guard let url = URL(string: "http://localhost/a") else { return }
let urlRequest = URLRequest(url: url)
getContent(urlRequest: urlRequest, decodable: A.self) {
a, error in
guard a = a else { return }
print(a.name!)
}
}
你知道我怎么能做到这一点吗?我也真的不知道如何调用这类参数或在谷歌上搜索什么可以引导我找到答案(缺乏词汇)。
谢谢!
【问题讨论】: