swift - 斯威夫特:我怎样才能在完成体内调用我的函数?
问题描述
我有一个具有完成参数的预定义函数:
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)
}
}
得到错误:转义闭包捕获非转义参数“解析”
我怎样才能传递enabled
给resolve
?
解决方案
resolve
参数被传递给一个函数checkNotificationEnabled
但没有被标记为@escaping(Bool)->())? = nil
optional 是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)
}
}
逃离闭包
当闭包作为参数传递给函数时,闭包被称为转义函数,但在函数返回后被调用。当您声明一个将闭包作为其参数之一的函数时,您可以在参数类型前写@escaping 以指示允许闭包转义。
闭包可以逃逸的一种方法是将其存储在函数外部定义的变量中。例如,许多启动异步操作的函数将闭包参数作为完成处理程序。函数在开始操作后返回,但在操作完成之前不会调用闭包——闭包需要转义,以便稍后调用。 资源
推荐阅读
- python - PyTest 弃用:'junit_family 默认值将更改为'xunit2'
- android - 创建新的 kotlin 项目时无法解决依赖关系
- multithreading - 线程中的 QProcess 有效,但有两种类型的输出错误
- wpf - ArcGIS .NET 从 WebMercator 转换为 Wgs84
- javascript - 停止制作表单以重新加载页面
- javascript - 最后如何在没有额外 AND 的情况下更好地构建这个 SQL 查询
- typo3 - 如何覆盖页面属性中的后端/制表符标签?
- c# - 在 Swagger 生成期间导入 OpenAPI 文档或 JSON
- error-handling - 如何编写 Clojure 线程宏?
- google-apps-script - 当与 Google App Script 匹配时,比较 1D 和 2D 数组并返回 2D 数组的值