Попытка изменить массив и объект, переданные в качестве параметров асинхронной функции
Поэтому, если вы посмотрите на код ниже, вы увидите следующую строку с ошибкой:
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
вне асинхронного блока он все равно не будет работать. Таким образом, вам нужен другой способ передать ссылочный тип (не тип значения) в функцию.