Вызовите функцию в init, которая ожидает инициализации свойств - PullRequest
1 голос
/ 31 марта 2020

У меня есть класс 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))
    }
}

Первая часть просто генерирует URL для доступа к API с помощью , Затем я запускаю URLSession, который загружает данные и затем анализирует их в DarkSkyResponse объект. Наконец, я установил переменную @Published для объекта прогноза.

Моя проблема в том, что когда я вызываю функцию в инициализаторе, я получаю ошибку, потому что свойство прогноза не инициализировано. Каков наилучший способ обойти это? Где я должен вызвать функцию? Кстати, я использую этот класс в своем SwiftUI View, используя оболочку свойства @ObservedObject

Ответы [ 2 ]

1 голос
/ 01 апреля 2020

Case1: использовать необязательно (и вам нужно обработать его в View)

@Published var forecast: DarkSkyResponse?

Case2: использовать какой-то экземпляр по умолчанию

@Published var forecast = DarkSkyResponse()

Оба варианта эквивалентны и приемлемы, поэтому просто по вашему выбору.

0 голосов
/ 01 апреля 2020

Попробуйте изменить:

@Published var forecast: DarkSkyResponse!

и

init() {
    super.init()
    self.getForecast(at: CLLocation(latitude: 37.334987, longitude: -122.009066))
}
...