调用init中等待属性初始化的函数



我有一个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))
}

最新更新