ios - 尝试改变作为参数传递给异步函数的数组和对象

标签 ios swift asynchronous mutating-function

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

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/

相关文章:

iphone - 我可以让 iphone 应用说话吗?

javascript - iOS 不更新 JavaScript 文件

ios View Controller 保持在内存中

ios - 当我在真实设备中频繁推送/返回 View Controller 时出现错误 "Index out of range"- Swift

python - Celery:何时何地使用运行@task 的.delay() 的返回值来更新数据库?

java - Android 启动画面和异步

ios - TableView 中未显示 Realm 数据

swift - 我必须在 SwiftUI 中使用 ObservableObject 吗?

iOS 远程通知处理应用程序事件案例

c# - 识别一系列异步操作的日志条目