【问题标题】:How to use @autoclosure parameter in async block in Swift?如何在 Swift 的异步块中使用 @autoclosure 参数?
【发布时间】:2015-05-21 22:34:51
【问题描述】:

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

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

我收到以下错误。

@noescape 参数的闭包使用可能允许它逃逸。

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

在 Xcode 6.4 (6E23) 中测试。

【问题讨论】:

    标签: swift closures


    【解决方案1】:

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

    带有autoclosure 属性的声明也暗示noescape,除非传递了可选属性escaping

    所以应该这样做:

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

    【讨论】:

    • 它很好用,但是这对使用这个 api 的用户来说会不会很危险?如果它是一个闭包并且假设它是异步的,我们知道我们必须使用[weak self],但如果它是一个转义的自动关闭用户不会使用[weak self]
    • 是的,当然。虽然如果你隐式引用self,编译器会警告你需要显式引用self以确认捕获(与闭包表达式相同)
    • 当然,请记住,没有什么可以阻止您使用显式闭包调用 myFuncmyFunc { [weak self] in self?.p ?? false }
    • 当使用短符号myFunc(true)时,编译器让我们知道自我捕获很遗憾[弱自我]是不可能的,我也无法使用myFunc { [weak self] in self?.p ?? false }
    • 而必须这样做:myApiCall ({ [weak self] in self?.loading = false }()),在编译时触发段错误
    猜你喜欢
    • 2014-07-28
    • 2018-10-01
    • 2020-04-23
    • 1970-01-01
    • 2018-06-26
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    相关资源
    最近更新 更多