因此,如果您查看下面的代码,您将看到以下行失败:
cannot use mutating member on immutable value: 'forecasts' is a 'let' constant
由forecasts.append(forecast)
引起。我有一个名为 ForecastService
的服务文件,我正在使用该函数从 API 异步获取 View Controller 中的 JSON。我试图将一个对象和一个对象数组传递给函数,然后我想要对其进行变异,以便我可以使用 View Controller 中的更新值来更新我的 UI。我想构造预测对象并将它们插入我在 View Controller 中初始化的数组中。
任何关于如何解决这个问题的澄清都会很好。
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()
}
}
}
最佳答案
问题不在于异步 block ,而在于参数预测
的机制。当您调用该函数时,即使您将其声明为 var,它也会被复制。因为 Swift 中的 Array 是值类型,所以这是 Swift 的策略。 (https://developer.apple.com/swift/blog/?id=10)
您可以尝试在异步 block 之外调用 forecasts.append
,它仍然会失败。因此,您需要另一种方法将引用类型(而不是值类型)传递到函数中。
关于ios - 尝试改变作为参数传递给异步函数的数组和对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42128235/