谈谈 Swift 中的 @escaping 关键字

目录

前言

一、什么是 @escaping?

二、@escaping 的使用场景

1.异步操作

2.存储闭包

三、示例

1.异步操作示例


前言

        Swift 是一门现代的编程语言,其设计理念是安全性和高效性。在 Swift 中,闭包(Closures)是一个强大且常用的特性。闭包允许我们捕获和存储变量或常量,然后在稍后使用。为了处理异步代码,Swift 提供了 @escaping 关键字。本文将详细介绍 @escaping 的含义、用法及其在开发中的重要性。。

一、什么是 @escaping?

        @escaping 是用在闭包类型前的关键字,表示闭包可能会在函数返回之后被调用。通常情况下,闭包是非逃逸的(non-escaping),这意味着闭包只在函数体内被执行,然后在函数返回时闭包生命周期结束。而当闭包被标记为 @escaping 时,它可以在函数返回之后继续存在,并且可以被存储和异步执行。

二、@escaping 的使用场景

        主要有两种情况需要使用 @escaping 关键字:

1.异步操作

        当闭包被传递给异步操作时,异步操作通常在函数返回后才会完成,因此闭包需要逃逸。

2.存储闭包

        当闭包需要被存储在外部变量或数据结构中,并在函数返回后调用时,需要标记为 @escaping。


三、示例

1.异步操作示例

        在以下示例中,performAsyncTask 函数接受一个闭包作为参数,并在异步任务完成后调用这个闭包。由于闭包在异步任务完成之前可能会逃逸函数的作用域,因此需要使用 @escaping。

func performAsyncTask(completion: @escaping () -> Void) {
    DispatchQueue.global().async {
        // 模拟异步任务
        sleep(2)
        // 异步任务完成后调用闭包
        completion()
    }
}

performAsyncTask {
    print("异步任务完成")
}

2.存储闭包示例

        在以下示例中,我们定义了一个 NetworkRequest 类,该类有一个 completionHandler 属性,用于存储闭包。由于闭包会在函数返回后被调用,所以需要使用 @escaping。

class NetworkRequest {
    var completionHandler: (() -> Void)?
    
    func startRequest(completion: @escaping () -> Void) {
        self.completionHandler = completion
        // 模拟网络请求
        DispatchQueue.global().async {
            sleep(2)
            // 请求完成后调用闭包
            self.completionHandler?()
        }
    }
}

let request = NetworkRequest()
request.startRequest {
    print("网络请求完成")
}

四、@escaping 的工作原理

        当闭包被标记为 @escaping 时,编译器会将闭包在堆(heap)上分配内存,从而确保闭包在函数返回后仍然存在。而非逃逸闭包则被分配在栈(stack)上,随着函数返回自动销毁。

五、@escaping 与非逃逸闭包的区别

  1. 声明周期管理:非逃逸闭包在函数内被调用,随着函数返回自动销毁;逃逸闭包在函数返回后仍可能被调用,需要手动管理其生命周期。
  2. 分配内存:非逃逸闭包通常分配在栈上,效率较高;逃逸闭包则分配在堆上,需要更多的内存管理。
  3. 语法要求:对于需要逃逸的闭包参数,必须显式使用 @escaping 关键字。

        

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我叫柱子哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值