通用解码器使用什么类型 class
What type to use for generic decodable class
我在 Swift 方面有一些基础知识,现在我正在尝试学习 iOS 开发。我目前正在开发一个小型应用程序,该应用程序会在 API 上请求资源 我已经将 returns json 制作自 :
struct A : Codable {
let name: String
let age: Int
}
struct B : Codable {
let something: String
}
API 和 app 都定义了这些结构。因为我总是查询相同的 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()
}
我的问题与可解码参数有关。这显示错误并阻止我编译应用程序。在 Whosebug 上找到一些资源后,我尝试将参数更改为
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!)
}
}
你知道我是怎么做到的吗?我也真的不知道如何调用这种类型的参数或在 google 上搜索什么可以引导我找到答案(缺乏词汇)。
谢谢!
试试这个,只需添加 Codable
的 generic
.Type
并使用其类型作为参数传递 foo.self
static func getContent<T: Codable>(urlRequest: URLRequest, decodable: T.Type, completion: @escaping (T?, 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()
}
你可以使用这个:
func genericRequest<T: Decodable>(_ request: URLRequest, completion: @escaping APIGenericRequestCompletion<T>) {
Alamofire.request(request).responseData { (response) in
guard let data = response.data else {
completion(nil)
return
}
do {
let decodedObject = try JSONDecoder().decode(T.self, from: data)
completion(decodedObject)
} catch {
completion(nil)
}
}
}
其中 APIGenericRequestCompletion 是:
typealias APIGenericRequestCompletion<T: Decodable> = (_ result: T?) -> Void
然后您将其用作:
genericRequest(request) { (decodableObjectResponse) in
// your code here
}
我在 Swift 方面有一些基础知识,现在我正在尝试学习 iOS 开发。我目前正在开发一个小型应用程序,该应用程序会在 API 上请求资源 我已经将 returns json 制作自 :
struct A : Codable {
let name: String
let age: Int
}
struct B : Codable {
let something: String
}
API 和 app 都定义了这些结构。因为我总是查询相同的 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()
}
我的问题与可解码参数有关。这显示错误并阻止我编译应用程序。在 Whosebug 上找到一些资源后,我尝试将参数更改为
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!)
}
}
你知道我是怎么做到的吗?我也真的不知道如何调用这种类型的参数或在 google 上搜索什么可以引导我找到答案(缺乏词汇)。
谢谢!
试试这个,只需添加 Codable
的 generic
.Type
并使用其类型作为参数传递 foo.self
static func getContent<T: Codable>(urlRequest: URLRequest, decodable: T.Type, completion: @escaping (T?, 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()
}
你可以使用这个:
func genericRequest<T: Decodable>(_ request: URLRequest, completion: @escaping APIGenericRequestCompletion<T>) {
Alamofire.request(request).responseData { (response) in
guard let data = response.data else {
completion(nil)
return
}
do {
let decodedObject = try JSONDecoder().decode(T.self, from: data)
completion(decodedObject)
} catch {
completion(nil)
}
}
}
其中 APIGenericRequestCompletion 是:
typealias APIGenericRequestCompletion<T: Decodable> = (_ result: T?) -> Void
然后您将其用作:
genericRequest(request) { (decodableObjectResponse) in
// your code here
}