【发布时间】:2021-01-09 06:32:46
【问题描述】:
我有以下两个函数用于帮助在 Swift 中解析 JSON。第一个函数可以很好地与我扔给它的任何 JSON 配合使用。
第二种方法让我很适应,但我无法弄清楚问题所在。我本质上想做与第一个函数相同的事情,但我的数据来自 URLSession 而不是本地文件。
任何想法我在这里做错了什么?我得到一个奇怪的编译器错误,Unexpected non-void return value in void function,但签名完全相同。
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()
}
【问题讨论】:
标签: json swift generics urlsession