我有一个Observable Object类来为我的应用存储预测对象
类看起来是这样的:
final class ForecastData: ObservableObject {
@Published var forecast: DarkSkyResponse
public func getForecast(at location: CLLocation) {
let request = DarkSkyRequest(key: "KEYGOESHERE")
let point = DarkSkyRequest.Point(location.coordinate.latitude, location.coordinate.longitude)
guard let url = request.buildURL(point: point) else {
//Handle this better
preconditionFailure("Failed to construct URL")
}
let task = URLSession.shared.dataTask(with: url) {
data, response, error in
DispatchQueue.main.async {
guard let data = data else {
//Handle this better
fatalError("No Data Recieved")
}
guard let forecast = DarkSkyResponse(data: data) else {
//Handle this better
fatalError("Decoding Failed")
}
self.forecast = forecast
}
}
task.resume()
}
init() {
self.getForecast(at: CLLocation(latitude: 37.334987, longitude: -122.009066))
}
}
第一部分简单地生成一个访问API的URL。然后我启动一个URLSession
,它下载数据,然后将其解析为DarkSkyResponse
对象。最后,我将@Published
变量设置为预测对象。
我的问题是,当我在初始化程序中调用函数时,我会得到一个错误,因为预测属性没有初始化。解决这个问题的最佳方法是什么?我应该在哪里调用函数?顺便说一句,我在SwiftUI视图中使用这个类,使用@ObservedObject
属性包装
Case1:使用可选(需要在View中处理(
@Published var forecast: DarkSkyResponse?
案例2:使用一些默认实例
@Published var forecast = DarkSkyResponse()
这两种变体都是等效的,可以接受,所以请根据您的喜好。
尝试以下更改:
@Published var forecast: DarkSkyResponse!
和
init() {
super.init()
self.getForecast(at: CLLocation(latitude: 37.334987, longitude: -122.009066))
}