我有一个具有完成参数的预定义函数:
func checkNotificationEnabled(_ resultBlock : ((Bool)->())? = nil){
Bool enabled = false
... a big block of code that gets enabled value
...
... end block
resultBlock?(enabled)
}
我需要获取对/错,然后将其传递给另一个函数:
@objc
func isNotificationEnabled(_
resolve: RCTPromiseResolveBlock, rejecter reject: RCTPromiseRejectBlock
) -> Void {
checkNotificationEnabled { (enabled:Bool) in
resolve(enabled)
}
}
得到错误:转义闭包捕获非转义参数'resolve'
如何将enabled
传递给resolve
?
假设RCTPromiseResolveBlock
上的func isNotificationEnabled
是您要针对completion
的func checkNotificationEnabled
执行的某个块,则完成实际上是“转义”(超过了)函数的作用范围,并且编译器只是抱怨您的RCTPromiseResolveBlock
在完成回调过程中可能没有运行(在执行中)
您必须将@escaping
标记为'resolve'参数才能解决此问题。
当您了解什么是转义的闭包时,您一定会更加清楚。看看这个问题:Escaping Closures in Swift
希望这会有所帮助。
resolve
参数传递给函数checkNotificationEnabled
,但未标记为@转义(Bool)->())? = nil
可选默认为nil
,因此无需分配nil(Bool)->()
这等于可读性更高的版本Void
。 typealias ResultBlock = (Bool) -> Void
func checkNotificationEnabled(_ resultBlock: ResultBlock?) {
var enabled = false
... a big block of code that gets enabled value
...
... end block
resultBlock?(enabled)
}
@objc
func isNotificationEnabled(_
resolve: @escaping RCTPromiseResolveBlock, rejecter reject: RCTPromiseRejectBlock) {
checkNotificationEnabled { enabled in
resolve(enabled)
}
}
转义闭包
闭包被传递为函数的参数,但在函数返回后调用。当您声明将闭包作为其中之一的函数时参数,您可以在参数类型之前写@转义指示允许关闭该封包。
闭包可以逃脱的一种方法是将其存储在变量中在函数外部定义的。例如,许多功能启动异步操作将闭包参数作为完成处理程序。函数启动后返回操作,但在操作完成之前不会调用闭包已完成-关闭需要退出,稍后再调用。source