关闭使用非转义参数--Swift 3问题

时间:2016-10-26 08:28:00

标签: swift swift3

我知道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)
    })

1 个答案:

答案 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) -> ()) -> ()