首页 > 解决方案 > 斯威夫特:我怎样才能在完成体内调用我的函数?

问题描述

我有一个具有完成参数的预定义函数:

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)
    }
}

得到错误:转义闭包捕获非转义参数“解析”

我怎样才能传递enabledresolve

标签: swiftswift4resolvecompletion

解决方案


  • resolve参数被传递给一个函数checkNotificationEnabled但没有被标记为@escaping
  • (Bool)->())? = niloptional 是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 以指示允许闭包转义。

闭包可以逃逸的一种方法是将其存储在函数外部定义的变量中。例如,许多启动异步操作的函数将闭包参数作为完成处理程序。函数在开始操作后返回,但在操作完成之前不会调用闭包——闭包需要转义,以便稍后调用。 资源


推荐阅读