我得到的两个错误是:
"'async '调用不能出现在全局变量初始值设定项中"和
调用可以引发,但不能从全局变量初始值设定项中引发错误
我的代码如下:
func getReps() async{
let apiService = APIService(urlString: (EnvSetup.baseUrl + EnvSetup.apiKey))
await Task{
let reps: [rep] = try await apiService.getJSON()
FileManager.endcodeAndSave(objects: reps, fileName: "reps.json")
print(reps.count)
}
}
我尝试过不使用异步并等待,将它们添加到我的调用程序中(这只是:
async{
await @Published var Reps: [rep] = getReps()
}
这是我第一次在Swift中使用API,所以这可能是一个简单的文件结构问题,但我已经在这方面工作了几个小时,没有任何效果。我将感谢任何帮助!
我试过修改async和await命令,但是,我总是得到同样的错误。我使用的APIService代码是Stewart Lynch的,如下所示:
import Foundation
public class APIService {
public let urlString: String
public init(urlString: String) {
self.urlString = urlString
}
public func getJSON<T: Decodable>( dateDecodingStategy: JSONDecoder.DateDecodingStrategy = .deferredToDate,
keyDecodingStrategy: JSONDecoder.KeyDecodingStrategy = .useDefaultKeys,
completion: @escaping (T) -> Void) {
guard let url = URL(string: urlString) else {
fatalError("Error: Invalid URL.")
}
let request = URLRequest(url: url)
URLSession.shared.dataTask(with: request) { (data, response, error) in
if let error = error {
fatalError("Error: \(error.localizedDescription)")
}
guard let data = data else {
fatalError("Error: Data is corrupt.")
}
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = dateDecodingStategy
decoder.keyDecodingStrategy = keyDecodingStrategy
do {
let decodedData = try decoder.decode(T.self, from: data)
completion(decodedData)
} catch {
fatalError("Error: \(error.localizedDescription)")
}
}.resume()
}
@available(iOS 14, *)
public func getJSON<T: Decodable>(dateDecodingStategy: JSONDecoder.DateDecodingStrategy = .deferredToDate,
keyDecodingStrategy: JSONDecoder.KeyDecodingStrategy = .useDefaultKeys) async throws -> T {
guard let url = URL(string: urlString) else {
fatalError("Error: Invalid URL.")
}
let request = URLRequest(url: url)
let (data, response) = try await URLSession.shared.data(for: request)
guard let _ = response as? HTTPURLResponse else {
fatalError("Error: Data Request error.")
}
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = dateDecodingStategy
decoder.keyDecodingStrategy = keyDecodingStrategy
guard let decodedData = try? decoder.decode(T.self, from: data) else {
fatalError("Error: Decoding error.")
}
return decodedData
}
}
1条答案
按热度按时间laik7k3q1#
标记为
async
的函数在异步上下文中运行,不需要额外的任务。并且你已经创建了函数
throw
或者添加了一个do - catch
块(第二个错误)。如果你想返回数据,也添加一个返回值。顺便说一句,请命名结构体和类与开始大写字母
并且
async { await @Published var ...
是错误的(第一个错误)。并实现
init