【问题标题】:How to access/manipulate a mutable array passed as parameter within a function in Swift 4.2x?如何访问/操作在 Swift 4.2x 的函数中作为参数传递的可变数组?
【发布时间】:2018-12-23 06:40:53
【问题描述】:

我有以下代码:

var rootTasks: [Task]?

func loadRootTasks() {
    rootTasks == nil ? rootTasks = [Task]() : rootTasks?.removeAll() // removeAll() works here
    TasksManager.loadTasks(parentTaskIDString: "0", tasks: &rootTasks!)
}

static func loadTasks(parentTaskIDString: String, tasks: inout [Task]) {

    let urlString = Config.httpsProtocol + "://" + Config.server + Config.portString + "/" + TasksManager.getTasksEndpoint + "/" + parentTaskIDString
    let url = URL(string: urlString)
    var urlRequest = URLRequest(url: url!)
    urlRequest.setValue(AccountsManager.sharedInstance.securityAccessToken, forHTTPHeaderField: "Authorization")

    let defaultSession = URLSession(configuration: .default)
    let getTasksTask = defaultSession.dataTask(with: urlRequest, completionHandler: { (data, response, error) in

        guard (response as? HTTPURLResponse)?.statusCode == 200 else {
            print("GetTasks response status code != 200")
            return
        }

        guard error == nil else {
            print("GetTasks error")
            return
        }

        guard let jsonData = data else {
            print("GetTasks did not receive JSON data")
            return
        }

        do {
            // PROBLEM is here:
            // compiler flags "Escaping closures can only capture inout parameters explicitly by value"
            tasks.removeAll() // removeAll() does not work here
            // same error here
            tasks = try JSONDecoder().decode([Task].self, from: jsonData)
            NotificationCenter.default.post(name: .rootTasksRefreshed, object: nil, userInfo: nil)
        }
        catch {
            print("GetTasks JSON parsing exception")
        }
    })

    getTasksTask.resume()
}

问题出在“// PROBLEM ...”行。编译器标记“转义闭包只能通过值显式捕获 inout 参数”错误。

函数“loadTasks”是一个静态方法,由“loadRootTasks”调用。它需要传递一个“tasks”数组,它是一个成员变量,并且需要在异步方法 dataTask() 运行后从静态方法内部进行修改。

如何解决问题才能“tasks.removeAll()”等?

我已阅读其他帖子,但没有针对 Swift 4.2 的帖子。我需要专门针对 Swift 4.2 的帮助。谢谢!

【问题讨论】:

    标签: arrays swift swift4.2


    【解决方案1】:

    您不能在异步代码中操作inout 参数。

    不过,在这种情况下,没有必要这样做。根本不要将 rootTasks 传递给您的 loadTasks 方法。首先,使您的loadTasks 方法成为实例方法而不是静态方法。现在您的loadTasks 方法可以查看 rootTasks,直接。所以它可以直接改变它!

    所以,到时候就不用说了

            tasks.removeAll() // removeAll() does not work here
    

    随便说

            self.rootTasks.removeAll()
    

    等等。

    (但是,您的异步代码可能应该注意仅在主线程上触摸self.rootTasks。)

    如果你不想这样做——也就是说,如果你坚持将loadTasks 作为一个静态方法——那么你将不得不以一种正常的方式来做这件事:loadTasks 必须采用一个完成处理程序,它然后它将调用,作为将数组异步传递回原始调用者的一种方式。

    【讨论】:

    • 我不能让 loadTasks 成为一个实例方法,因为对于任何非根任务的任务,它们将被保存在一个字典映射中,以父任务为键(我还没有编程这个)。所以,我会尝试完成处理程序的方法。此处有关编码的任何提示将不胜感激。谢谢!
    • "您不能在异步代码中操作 inout 参数。" > 这是有道理的!谢谢!
    猜你喜欢
    • 2021-02-25
    • 2013-01-20
    • 1970-01-01
    • 2017-11-04
    • 1970-01-01
    • 2019-10-21
    • 2015-09-22
    • 2018-01-20
    • 1970-01-01
    相关资源
    最近更新 更多