我知道Swift 3中的更改,其中@nonevinging是闭包的默认行为。
我已经成功地更改了有关更改的大部分代码,但我的代码中有一部分无法摆脱闭包使用非转义参数可能允许它转义编译错误。
我尝试过在updateHandler参数和UpdatedInProgressHandler typealias中添加@逃逸,但这似乎还不够。
有人能帮我找出问题的原因吗?
定义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)
}
}
在调用presentUpdateInProgress函数时,我得到“非转义参数的闭包使用”updateCompleted“的代码可能允许if-to-escape”错误。
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)
})
updateComplated
的类型是(_已完成:@转义UpdateInProgressComplection)-
因此,为了允许
updateComplted
转义,您需要标记(_已完成:@逃逸UpdateInProgressComplection)-
typealias UpdateInProgressHandler = (@escaping (_ completed: @escaping UpdateInProgressCompletion) -> ()) -> ()
我有一个协议: 通过一个示例实现: 上面的代码在 Swift3 (Xcode8-beta5) 中编译和工作,但不再与 beta 6 一起使用。你能给我指出根本原因吗?
问题内容: 我有一个协议: 通过示例实现: 上面的代码已在Swift3(Xcode8-beta5)中编译并工作,但不再与beta 6一起工作。您能指出我的根本原因吗? 问题答案: 这是由于功能类型参数的默认行为发生了变化。在Swift 3(特别是Xcode 8 beta 6附带的内部版本)之前,它们将默认转义- 您必须对其进行标记,以防止它们被存储或捕获,从而确保它们不会超过使用寿命函数调用。 但
问题内容: 鉴于: 有什么方法可以使参数(和)的类型也保持不变? 更改类型会出现以下错误: @escaping属性仅适用于函数类型 删除该属性后,代码将编译并运行,但由于闭包使函数的作用范围变大,因此似乎并不正确。 问题答案: 有一个SR-2552报告无法识别功能类型别名。这就是错误的原因。您可以通过扩展函数签名中的函数类型来解决: 编辑1 : 我实际上是在xcode 8 beta版本下,但尚未解
鉴于: 有什么方法可以使类型的参数(和)并且还保留? 更改类型会产生以下错误: @escaping属性仅适用于函数类型 删除属性,代码将编译并运行,但似乎不正确,因为闭包正在转义函数的范围。
我正在尝试将closurse用于一阶谓词演算,并打算定义以下函数: 它将谓词< code>p: Pred作为参数 的返回是一个谓词转换器闭包类型 中显式使转义。 我怎样才能解决这个问题?
我有一个,其形式为: 但是我得到错误:< code >将非转义参数“someOtherClosure”传递给需要@escaping闭包的函数。 这两个闭包实际上都是不可转义的(默认情况下),并且显式地将添加到会产生一个警告,表明这是Swift 3.1中的默认值。 知道我为什么会得到这个错误吗?