当前位置: 首页 > news >正文

defer关键字

目录

  • 一、核心特性
  • 二、主要应用场景
    • 2.1. 资源清理(最常用)
    • 2.2. 锁管理
    • 2.3. 错误处理
    • 2.4. 状态恢复
  • 三、执行时机示例
  • 四、注意事项
  • 五、与其它语言对比
  • 六、最佳实践

defer 是 Swift 语言中的一个重要关键字,用于声明一个代码块在当前作用域退出前执行,无论作用域是通过正常流程结束还是因错误提前退出。它的主要用途是确保清理工作(如资源释放、状态恢复等)始终被执行。

一、核心特性

  1. 延迟执行
func example() {print("步骤1")defer { print("清理操作") } // 最后执行print("步骤2")
}
// 输出:
// 步骤1
// 步骤2
// 清理操作
  1. 逆序执行(多个 defer 时):
func multiDefer() {defer { print("第一个defer") }defer { print("第二个defer") }print("函数主体")
}
// 输出:
// 函数主体
// 第二个defer
// 第一个defer
  1. 作用域绑定
if condition {defer { print("条件块内的defer") }// ...
}
// defer 在 if 块结束时执行

二、主要应用场景

2.1. 资源清理(最常用)

func readFile() {let file = openFile("data.txt")defer {closeFile(file) // 确保文件一定会关闭print("文件已关闭")}// 可能抛出错误或提前返回try processFile(file)
}

2.2. 锁管理

func threadSafeOperation() {lock.lock()defer { lock.unlock() } // 确保锁一定会释放// 临界区操作sharedResource.modify()
}

2.3. 错误处理

func riskyOperation() throws {let resource = acquireResource()defer { releaseResource(resource) } // 成功失败都会释放try mayThrowError()try anotherRiskyCall()
}

2.4. 状态恢复

func updateUI() {let originalColor = view.backgroundColordefer { view.backgroundColor = originalColor } // 恢复原始状态// 临时改变UIview.backgroundColor = .yellowperformAnimation()
}

三、执行时机示例

func deferTiming() -> String {defer { print("defer 执行") }if true {print("返回前")return "返回值"}
}
/* 输出:返回前defer 执行
*/

四、注意事项

  1. 作用域规则
func scopeExample() {do {defer { print("内部defer") }}print("外部")defer { print("外部defer") } // 最后执行
}
// 输出:内部defer → 外部 → 外部defer
  1. 返回值影响
func returnExample() -> Int {var value = 10defer { value = 20 } // 不会改变返回值return value
}
print(returnExample()) // 输出 10
  1. 循环中的 defer
for i in 1...3 {defer { print("循环结束: \(i)") }print("循环开始: \(i)")
}
/* 输出:循环开始: 1循环结束: 1循环开始: 2循环结束: 2循环开始: 3循环结束: 3
*/
  1. 避免在 defer 中抛错
func dangerousDefer() throws {defer {// 避免在此抛出新错误,会覆盖原始错误}try somethingRisky()
}

五、与其它语言对比

特性Swift (defer)Java (try-with-resources)Python (with)
资源自动释放
错误处理集成
可用于任意作用域
多个清理操作✅ (逆序)
修改返回值

六、最佳实践

  1. 保持 defer 块简短
// ✅ 推荐
defer { cleanup() }// ❌ 避免
defer {step1()step2()// 复杂逻辑
}
  1. 处理依赖关系
func resourceHandling() {let res1 = acquireA()defer { releaseA(res1) }// res2 依赖 res1let res2 = acquireB(res1)defer { releaseB(res2) } // 后申请的先释放
}

3.配合 do-catch

func loadData() {do {let data = try fetchData()defer { cleanup() } // 成功和失败都会执行process(data)} catch {handleError(error)}
}

defer 是 Swift 中实现"资源获取即初始化"(RAII)模式的关键工具,它能显著提高代码的安全性和可读性,特别是在涉及资源管理和错误处理的场景中。

http://www.lryc.cn/news/585672.html

相关文章:

  • PHT-CAD 笔记
  • 你见过的最差的程序员是怎样的?
  • docker设置代理
  • 秋招小白学数据结构-1-数据结构前置知识
  • 嵌入式八股文之 GPIO
  • 深入解析 TCP 连接状态与进程挂起、恢复与关闭
  • Elasticsearch 滚动(Scroll)用法、使用场景及与扫描(Scan)的区别
  • 常见的数集 N,Z,R,Q,C
  • 微积分核心考点全解析
  • 二维数组打乱元素
  • 【环境配置】KAG - Windows 安装部署
  • 开源界迎来重磅核弹!月之暗面开源了自家最新模型 K2
  • 从代码学习深度学习 - 针对序列级和词元级应用微调BERT PyTorch版
  • T16IZ遥控器教程__遥控器与无人机对频
  • spring-boot项目集成spring-ai
  • 基于k8s环境下pulsar高可用测试和扩缩容(下)
  • Web攻防-SSTI服务端模版注入利用分类语言引擎数据渲染项目工具挖掘思路
  • 华为认证笔试考试中心/VUE考场考试规则与环境欣赏
  • 智慧水文站系统:实时监控、全要素监测与AI辅助
  • 爬虫练习1
  • 数据库报错:Column ‘xxx‘ in field list is ambiguous
  • pyQt基础4(对话框)
  • JAX study notes[16]
  • Java项目中图片加载路径问题解析
  • Python Day10
  • LLM场景下的强化学习【GRPO】
  • Spring Boot整合MyBatis+MySQL实战指南(Java 1.8 + 单元测试)
  • 上位机知识篇---端口
  • latex格式中插入eps格式的图像的编译命令
  • 异步复习(线程)