Swift 4:如何在完成主体中调用我的函数?

问题描述 投票:0回答:2

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

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

swift resolve completion
2个回答
0
投票

假设RCTPromiseResolveBlock上的func isNotificationEnabled是您要针对completionfunc checkNotificationEnabled执行的某个块,则完成实际上是“转义”(超过了)函数的作用范围,并且编译器只是抱怨您的RCTPromiseResolveBlock在完成回调过程中可能没有运行(在执行中)

您必须将@escaping标记为'resolve'参数才能解决此问题。

当您了解什么是转义的闭包时,您一定会更加清楚。看看这个问题:Escaping Closures in Swift

希望这会有所帮助。


0
投票
  • 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

© www.soinside.com 2019 - 2024. All rights reserved.