我有以下代码:
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()
}
问题在“//问题…”一行。编译器标记“转义闭包只能按值显式捕获inout参数”错误。
函数“loadTasks”是一个静态方法,由“loadRootTasks”调用。它需要传递一个作为成员变量的“tasks”数组,并且需要在异步方法dataTask()运行后从静态方法中进行修改。
如何解决问题以能够“tasks.removeAll()”等?
我读过其他文章,但没有Swift 4.2。我需要特别帮助斯威夫特4.2。谢谢!
最佳答案
不能在异步代码中操作inout
参数。
不过,在这种情况下,没有必要这样做。根本不要将rootTasks
传递给您的loadTasks
方法。首先,让loadTasks
方法成为实例方法,而不是静态方法。现在您的loadTasks
方法可以直接看到rootTasks
。所以它可以直接改变它!
所以,在那一点上,没必要说
tasks.removeAll() // removeAll() does not work here
就说吧
self.rootTasks.removeAll()
等等。
(但是,您的异步代码应该注意只在主线程上触摸
self.rootTasks
。)如果您不想这样做—也就是说,如果您坚持将
loadTasks
作为静态方法保留—那么您必须以正常的方式这样做:loadTasks
必须采用一个完成处理程序,然后它将调用它,作为异步将数组传递回原始调用方的方式。