【发布时间】:2021-06-21 05:33:45
【问题描述】:
我正在尝试修改地标教程中的 Apple 代码,以从远程 URL 加载 JSON 数据。 url 是一个 php 脚本,它返回纯文本 JSON 数据。
苹果的代码:
func loadLocalJSON<T: Decodable>(_ filename: String) -> T {
let data: Data
guard let file = Bundle.main.url(forResource: filename, withExtension: nil)
else {
fatalError("Couldn't find \(filename) in main bundle")
}
do {
data = try Data(contentsOf: file)
} catch {
fatalError("Couldn't load \(filename) from main bundle:\n\(error)")
}
do {
let decoder = JSONDecoder()
return try decoder.decode(T.self, from: data)
} catch {
fatalError("Couldn't parse \(filename) from main bundle:\n\(error)")
}
}
以及我当前修改的代码:
func loadRemoteJSON<T: Decodable>(_ urlString: String) -> T {
let data: Data
guard let url = URL(string: urlString) else {
fatalError("Invalid URL")
}
let request = URLRequest(url: url)
URLSession.shared.dataTask(with: request) { data, response, error in
guard let data = data else {
fatalError(error?.localizedDescription ?? "Unknown Error")
}
do {
let decoder = JSONDecoder()
return try decoder.decode(T.self, from: data) // <--ERROR HERE
} catch {
fatalError("Couldn't parse data from \(urlString)\n\(error)")
}
}
}
我得到的错误是Unexpected non-void return value in void function
我认为该函数应该返回一个 T 的实例。我哪里出错了?
【问题讨论】:
-
"我得到的错误是 Unexpected non-void return value in void function" Where!?
-
您的 URL 会话缺少某些内容。
-
我认为您需要一个完成块而不是返回。如果您使用新的 async-await,则 return 很好,但此代码不适用于此。
-
我同意@RajaKishan-如果你正在运行异步任务,你不应该使用 return,你的变量的值可能会被
loadRemoteJSON初始化为 nil,因为 Swift 将继续前进通过您的代码,而无需等待该变量的初始化。