zoukankan      html  css  js  c++  java
  • Escaping Closures 两点:本质是生命周期标示符

    1、block需要(拷贝)保存;

    2、block引用的环境变量需要处理。

    相当于oc中的copy block。

    Escaping Closures

    A closure is said to escape a function when the closure is passed as an argument to the function, but is called after the function returns. When you declare a function that takes a closure as one of its parameters, you can write @escaping before the parameter’s type to indicate that the closure is allowed to escape.

    One way that a closure can escape is by being stored in a variable that is defined outside the function. As an example, many functions that start an asynchronous operation take a closure argument as a completion handler. The function returns after it starts the operation, but the closure isn’t called until the operation is completed—the closure needs to escape, to be called later. For example:

    1. var completionHandlers: [() -> Void] = []
    2. func someFunctionWithEscapingClosure(completionHandler: @escaping () -> Void) {
    3. completionHandlers.append(completionHandler)
    4. }

    The someFunctionWithEscapingClosure(_:) function takes a closure as its argument and adds it to an array that’s declared outside the function. If you didn’t mark the parameter of this function with @escaping, you would get a compile-time error.

    Marking a closure with @escaping means you have to refer to self explicitly within the closure. For example, in the code below, the closure passed to someFunctionWithEscapingClosure(_:) is an escaping closure, which means it needs to refer to self explicitly. In contrast, the closure passed to someFunctionWithNonescapingClosure(_:) is a nonescaping closure, which means it can refer to self implicitly.

    1. func someFunctionWithNonescapingClosure(closure: () -> Void) {
    2. closure()
    3. }
    4. class SomeClass {
    5. var x = 10
    6. func doSomething() {
    7. someFunctionWithEscapingClosure { self.x = 100 }
    8. someFunctionWithNonescapingClosure { x = 200 }
    9. }
    10. }
    11. let instance = SomeClass()
    12. instance.doSomething()
    13. print(instance.x)
    14. // Prints "200"
    15. completionHandlers.first?()
    16. print(instance.x)
    17. // Prints "100"
  • 相关阅读:
    简易花台制作攻略
    欢迎
    VxWorks操作系统MakeFile(三)
    原创连载:往事
    VxWorks操作系统MakeFile(五)
    致亲爱的板儿的一封信
    VxWorks操作系统MakeFile(二)
    华为NE5000E集群路由器荣获InfoVision奖
    台式机安装黑苹果Mac OS X Snow Leopard 10.6相关资源
    未能加载文件或程序集Office, Version=2.2.0.0, Culture=neutral, PublicKeyToken=null或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。 (异常来自 HRESULT:0x80131040)
  • 原文地址:https://www.cnblogs.com/feng9exe/p/9215100.html
Copyright © 2011-2022 走看看