如何在Swift中的异步块中使用@autoclosure参数?

Evg*_*nii 4 closures swift

我想在dispatch_async块内调用@autoclosure参数.

func myFunc(@autoclosure condition: () -> Bool) {
  dispatch_async(dispatch_get_main_queue()) {
    if condition() {
      println("Condition is true")
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我收到以下错误.

关闭使用@noescape参数可能允许它逃脱.

是否可以异步调用@autoclosure参数?

在Xcode 6.4(6E23)中测试过.

Air*_*ity 13

是的,只要你声明它们@autoclosure(escaping):

具有该autoclosure属性的声明也意味着noescape,除非传递了可选属性escaping.

所以这应该这样做:

func myFunc(@autoclosure(escaping) condition: () -> Bool) {
    dispatch_async(dispatch_get_main_queue()) {
        if condition() {
            println("Condition is true")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 它工作得很好但是这对使用这个API的用户来说是危险的吗?如果它是一个闭包,让我们说它是异步的,我们知道我们必须使用`[weak self]`但是如果它是一个转义的autoclosure用户不会使用`[weak self]`? (2认同)