当前位置: 首页 > 编程笔记 >

iOS开发中Swift逃逸闭包知识

姜天宇
2023-03-14
本文向大家介绍iOS开发中Swift逃逸闭包知识,包括了iOS开发中Swift逃逸闭包知识的使用技巧和注意事项,需要的朋友参考一下

逃逸闭包必须满足下面2个条件:

1、闭包作为一个参数传到函数中

2、闭包在函数返回之后才执行

需要在参数前面加入标注: @escaping,用来指明这个闭包是允许“逃逸”出这个函数的。

注意:将一个闭包标记为 @escaping 意味着你必须在闭包中显式地引用

import UIKit

/** 逃逸闭包满足下面2个条件:
 * 1、handle闭包作为一个参数传到函数payRequest中
 * 2、并且handle闭包在函数返回之后才执行
 * 需要在参数前面加入标注: @escaping,用来指明这个闭包是允许“逃逸”出这个函数的
 * 注意:将一个闭包标记为 @escaping 意味着你必须在闭包中显式地引用 self
 */
func payRequest(handle:@escaping (Data?, URLResponse? ,Error?) -> Void) {
  let urlStr = URL(string: "http://www.baidu.com")
  let session = URLSession(configuration: .default)
  session.dataTask(with: urlStr!, completionHandler: handle)
}
func someFunctionWithNonescapingClosure(closure: () -> Void) {
  closure()
}
class SomeClass {
  var x = 10
  func doSomething() {
    payRequest { (data, resp, error) in
      x = 100 // 此处编译错误,必须显式地引用 self
    }
    someFunctionWithNonescapingClosure { x = 200 }
  }
}

在Swift标准库中,有很多这种类型的闭包,比如下面的异步请求的方法:

open func dataTask(with request: URLRequest, completionHandler: @escaping (Data?, URLResponse?, Error?) -> Swift.Void) -> URLSessionDataTask

open func dataTask(with url: URL, completionHandler: @escaping (Data?, URLResponse?, Error?) -> Swift.Void) -> URLSessionDataTask

都符合文章开头提到的逃逸闭包的形成条件。

 类似资料:
  • 我正在使用terraform文件中的remote exec provisioner在ec2上运行一些命令。但我一直在逃避命令中的特殊字符。这部分代码来自我的main。远程exec provisioner部分中的tf文件。terraform中出现的错误是“无效字符”和“无效多行字符串”。我想要正确的字符串序列,以便这些命令可以在我的ec2上执行。

  • 我已通过设置以下内容将PowerShell添加到上下文菜单: 这工作得很好,除了我出色地命名为的文件夹。它失败了: 从文档: 指定位置的路径。LiteralPath参数的值的使用方式与键入的完全相同。没有字符被解释为通配符。如果路径包含转义字符,请用单引号将其括起来。单引号告诉PowerShell不要将任何字符解释为转义序列。 我是否可以选择使用,希望我的目录名称中没有可能的通配符?或者可以在中转

  • Swift 本以为 Swift 3 之后 Swift 就会稳定了,听闻 Swift 4 还会有 breaking change,本文档 Swift 部分暂时先搁置吧… 链接 类与对象 结构体与枚举 函数与闭包

  • 我想把JavaScript onClick属性使用Thym立叶。 我这样写代码 此代码正在运行。当productName包含这样的特殊字符时,我会遇到问题 然后JavaScript函数看起来像这样 我需要从产品名称中转义双引号和单引号字符。我该怎么做?

  • 本文向大家介绍Java中的逃逸问题心得,包括了Java中的逃逸问题心得的使用技巧和注意事项,需要的朋友参考一下 大家一般认为new出来的对象都是被分配在堆上,但这并不是完全正确,通过对Java对象分配过程分析,我们发现对象除了可以被分配在堆上,还可以在栈或TLAB中分配空间。而栈上分配对象的技术基础是逃逸分析和标量替换,本文主要介绍下逃逸分析。 逃逸分析的定义 逃逸分析,是一种可以有效减少Java

  • 本文向大家介绍java中jvm逃逸问题分析,包括了java中jvm逃逸问题分析的使用技巧和注意事项,需要的朋友参考一下 引言: 逃逸分析(Escape Analysis)是众多JVM技术中的一个使用不多的技术点,本文将通过一个实例来分析其使用场景。 概念 逃逸分析,是一种可以有效减少Java 程序中同步负载和内存堆分配压力的跨函数全局数据流分析算法。通过逃逸分析,Java Hotspot编译器能够