如何解决在Swift 5中使用泛型解析JSON-本地文件与URL
我有以下两个函数用于帮助在Swift中解析JSON。第一个函数可以与我抛弃的任何JSON完美结合。
第二种方法是让我适应,但我无法弄清楚问题所在。我本质上想做与第一个函数相同的事情,但是我的数据来自URLSession而不是本地文件。
有什么想法我在这里做错了吗?我收到一个奇怪的编译器错误,即 void函数中意外的非void返回值,但签名完全相同。
import Foundation
import SwiftUI
// Populates Model from local files
public func loadFromJson<T: Decodable>(_ filename: String) -> T {
let data: Data
guard let path = Bundle.main.path(forResource: filename,ofType: "json")
else{
fatalError("\(filename) not found.")
}
do {
let file = URL(fileURLWithPath: path)
data = try Data(contentsOf: file)
} catch {
fatalError("Could not load \(filename): (error)")
}
do{
return try JSONDecoder().decode(T.self,from: data)
} catch {
fatalError("Unable to parse \(filename): (error)")
}
}
// Populates Model from REST endpoint
public func loadFromJsonFromURL<T: Decodable>(_ urlString: String) -> T {
let data: Data
let url = URL(string: urlString)!
let task = URLSession.shared.dataTask(with: url) { data,response,error in
if let error = error {
fatalError("Error: \(error.localizedDescription)")
}
guard let response = response as? HTTPURLResponse,response.statusCode == 200 else {
fatalError("Error: invalid HTTP response code")
}
guard let data = data else {
fatalError("Error: missing response data")
}
do {
return try JSONDecoder().decode(T.self,from: data)
}
catch {
print("Error: \(error.localizedDescription)")
}
}
task.resume()
}
解决方法
dataTask(with: completionHandler:)
是异步方法。因此,直到收到响应后调用completionHandler
为止,方法loadFromJsonFromURL(_:_:)
已经返回。
在收到API的响应后,您需要使用 closure
将数据传回。
public func loadFromJsonFromURL<T: Decodable>(_ urlString: String,_ handler: @escaping ((T?)->())) {
if let url = URL(string: urlString) {
let task = URLSession.shared.dataTask(with: url) { data,response,error in
if let error = error {
fatalError("Error: \(error.localizedDescription)")
}
guard let response = response as? HTTPURLResponse,response.statusCode == 200 else {
fatalError("Error: invalid HTTP response code")
}
guard let data = data else {
fatalError("Error: missing response data")
}
do {
let value = try JSONDecoder().decode(T.self,from: data)
handler(value)
}
catch {
print("Error: \(error.localizedDescription)")
handler(nil)
}
}
task.resume()
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。