我知道Swift 3中的变化,其中@nonescaping是闭包的默认行为。
我已成功更改了有关更改的大部分代码,但我有一部分代码,我无法摆脱关闭使用非转义参数可能会让它逃脱编译错误。
我已经尝试将@escaping添加到updateHandler参数和UpdatedInProgressHandler类型,但它似乎还不够。
任何人都能帮我弄清问题的原因吗?
定义typealiases和函数的代码:
// Typealiases used to clean up closures
typealias UpdateInProgressCompletion = () -> ()
typealias UpdateInProgressCancelCompletion = () -> ()
typealias UpdateInProgressHandler = ((_ completed: @escaping UpdateInProgressCompletion) -> ()) -> ()
// Method for wrapping the presentation and dismissal of the custom alert controller
func presentUpdateInProgress(_ taskIdentifier: String?, alertMessage: String?, alertHeader: String? = nil, updateHandler: @escaping UpdateInProgressHandler, cancel cancelHandler: UpdateInProgressCancelCompletion? = nil) {
let updateInProgressAlert = self.updateInProgressAlert( taskIdentifier, alertMessage: alertMessage, alertHeader: alertHeader ) { action in
cancelHandler?()
Logger.debug("User cancelled update")
}
updateInProgressAlert.present(completion: nil)
updateHandler { (completion) in
updateInProgressAlert.dismiss(completion: completion)
}
}
我获得"关闭使用非转义参数的代码" updateCompleted"可能允许如果逃避"调用presentUpdateInProgress函数时出错。
self.presentUpdateInProgress(taskIdentifier, alertMessage: "My alert message", updateHandler: { (updateCompleted) -> () in
let task = CreateModelTask(completionHandler: { (resultObject) -> () in
updateCompleted { // this generates the error
//Do some stuff with received result
}
})
task.taskIdentifier = taskIdentifier
SyncManager.sharedManager.addTaskToQueue(task)
})
答案 0 :(得分:2)
updateCompleted
属于(_ completed: @escaping UpdateInProgressCompletion) -> ()
类型,因为它是一个函数参数本身,意味着默认情况下它是非转义的(请注意&#39 ;默认情况下非转义'行为仅适用于函数闭包参数,请参阅this Q&A,以及关于该主题的its dupe target。
因此,为了允许updateCompleted
转义,您需要在(_ completed: @escaping UpdateInProgressCompletion) -> ()
中将@escaping
标记为typealias
:
typealias UpdateInProgressHandler = (@escaping (_ completed: @escaping UpdateInProgressCompletion) -> ()) -> ()