使用 Swift 的 defer 管理状态清理(译文)

在异步函数中处理清理逻辑时,defer语句能确保代码在当前作用域退出前执行,无论函数是正常结束、抛出错误还是被提前返回。本文将通过一个常见场景------显示/隐藏加载指示器------演示 defer的用法。

典型用例

swift 复制代码
func fetch() async {
    isLoading = true
    defer { isLoading = false } // 清理逻辑集中在此
    
    do {
        articles = try await service.fetchArticles()
    } catch {
        self.error = error.localizedDescription
    }
}

传统实现方式对比

  1. 多位置设置(易遗漏):
swift 复制代码
isLoading = true
do {
    ...
    isLoading = false
} catch {
    ...
    isLoading = false
}
  1. 单次底部设置(无法应对提前退出):
swift 复制代码
isLoading = true
do {
    ...
} catch {
    ...
}
isLoading = false // 若中途 return 或 await 取消,此行不会执行

defer 的优势

  • 统一清理入口:将清理逻辑集中在一处,避免分散在各分支。

  • 容错性:自动处理以下场景:

    • 函数正常结束
    • 抛出错误
    • 提前返回(return
    • await过程中被取消

适用场景扩展

  • 资源释放:文件句柄、网络连接等
  • UI 状态管理:进度条、禁用按钮等
  • 并发安全 :配合 actor防止竞态条件

总结

defer是 Swift 中管理临时状态和资源的利器,尤其适合异步编程场景。通过将清理逻辑延迟到作用域结束时执行,它能显著提升代码的健壮性和可维护性,降低因流程分支复杂导致的遗漏风险。对于需要确保执行清理操作的场景(如加载状态、锁机制等),建议优先考虑使用 defer

相关推荐
大熊猫侯佩3 小时前
Swift 6 驱魔实录:揭开 Combine 与 @Sendable 的“血色契约”
swift·block·combine·preconcurrency·sendable·mainactor·isolation
初级代码游戏4 小时前
iOS开发 SwiftUI 15:手势 拖动 缩放 旋转
ios·swiftui·swift
ujainu6 小时前
Flutter + OpenHarmony 游戏开发进阶:虚拟摄像机系统——平滑跟随与坐标偏移
开发语言·flutter·游戏·swift·openharmony
初级代码游戏3 天前
iOS开发 SwiftUI 14:ScrollView 滚动视图
ios·swiftui·swift
初级代码游戏3 天前
iOS开发 SwitftUI 13:提示、弹窗、上下文菜单
ios·swiftui·swift·弹窗·消息框
zhyongrui3 天前
托盘删除手势与引导体验修复:滚动冲突、画布消失动画、气泡边框
ios·性能优化·swiftui·swift
zhangfeng11333 天前
CSDN星图 支持大模型微调 trl axolotl Unsloth 趋动云 LLaMA-Factory Unsloth ms-swift 模型训练
服务器·人工智能·swift
zhyongrui4 天前
SnipTrip 发热优化实战:从 60Hz 到 30Hz 的性能之旅
ios·swiftui·swift
大熊猫侯佩5 天前
Neo-Cupertino 档案:撕开 Actor 的伪装,回归 Non-Sendable 的暴力美学
swift·observable·actor·concurrency·sendable·nonsendable·data race
2501_915921436 天前
在没有源码的前提下,怎么对 Swift 做混淆,IPA 混淆
android·开发语言·ios·小程序·uni-app·iphone·swift