Попытка изменить массив и объект, переданные в качестве параметров асинхронной функции

Поэтому, если вы посмотрите на код ниже, вы увидите следующую строку с ошибкой:

cannot use mutating member on immutable value: 'forecasts' is a 'let' constant

вызванный forecasts.append(forecast), У меня есть служебный файл, который вы видите ниже, который называется ForecastService и я использую функцию для асинхронного получения JSON в моем контроллере представления из API. Я пытаюсь передать объект и массив объектов в функцию, которую затем хочу изменить, чтобы я мог использовать обновленные значения в моем контроллере представления для обновления своего пользовательского интерфейса. Я хочу построить объекты прогноза и вставить их в массив, который я инициализировал в контроллере представления.

Любое разъяснение о том, как я могу обойти эту проблему, было бы здорово.

import Foundation

import Alamofire

class ForecastService {

    static let sharedInstance = ForecastService()

    private init() {}

    func downloadForecastDetails(forecast: Forecast, forecasts: [Forecast], completed: @escaping DownloadComplete) {
        let url = URL(string: FORECAST_URL)!

        Alamofire.request(url).responseJSON { response in
            let result = response.result.value

            if let dict = result as? Dictionary<String, AnyObject> {
                if let list = dict["list"] as? [Dictionary<String, AnyObject>] {

                    for obj in list {
                        let forecast = Forecast(weather: obj)
                        forecasts.append(forecast)
                    }
                }

            }

            completed()
        }

    }
}

1 ответ

Проблема не в асинхронном блоке, а в механизме параметра forecasts, Он копируется при вызове функции, даже если вы объявляете ее как var. Поскольку Array is Swift является типом значения, это политика Swift. ( https://developer.apple.com/swift/blog/?id=10) Вы можете попробовать позвонить forecasts.append вне асинхронного блока он все равно не будет работать. Таким образом, вам нужен другой способ передать ссылочный тип (не тип значения) в функцию.

Другие вопросы по тегам