0

因此,如果您查看下面的代码,您将看到以下行失败:

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

引起的forecasts.append(forecast)。我有一个您在下面看到的服务文件,ForecastService我正在使用该函数从 API 异步获取视图控制器中的 JSON。我正在尝试将一个对象和一个对象数组传递给我想要对其进行变异的函数,以便我可以使用视图控制器中的更新值来更新我的 UI。我想构造预测对象并将它们推送到我在视图控制器中初始化的数组中。

任何关于我如何解决这个问题的说明都会很棒。

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()
        }

    }
}
4

1 回答 1

0

问题不是异步块,而是参数的机制forecasts。它在您调用函数时被复制,即使您将其声明为 var。因为 Array 是 Swift 是值类型,所以它是 Swift 的策略。( https://developer.apple.com/swift/blog/?id=10 ) 你可以尝试forecasts.append在异步块外调用,还是会失败。因此,您需要另一种方法将引用类型(不是值类型)传递给函数。

于 2017-02-09T04:54:34.070 回答