LESSON 10 / 576 分钟

函数、闭包与错误处理

读懂参数标签、尾随闭包和 throws,就能理解大部分框架调用。

用你的前端经验理解

闭包类似箭头函数;try/catch 对应 do/try/catch,但 Swift 的可抛错函数需要声明 throws。

为什么需要它

函数签名就是调用者与实现之间的契约:需要什么输入、返回什么、是否可能失败、是否需要等待。Swift 的参数标签让调用位置更接近自然语言。闭包则把一段行为当作值传递,按钮回调、集合转换和异步完成处理都会用到它;阅读时先确认它何时执行以及捕获了谁。

它是怎样工作的

throws 表示错误可以沿调用链向上传递,调用方用 try 和 do/catch 处理。try? 会把失败转换成 nil,适合确实不关心原因的尝试;try! 则假定不会失败。逃逸闭包可能在函数返回后才执行,捕获对象可能延长其生命周期;是否需要 weak self 要根据实际引用关系判断,不能机械地给每个闭包添加。

把关键概念连起来

1

参数

参数标签是 API 可读性的一部分。func greet(to name: String) 用 greet(to: "Lin") 调用;_ 省略外部标签。

2

闭包

{ value in ... } 定义闭包;$0 表示第一个参数。尾随闭包只是调用语法,不会自动异步执行。

3

错误

try 传播或捕获错误;try? 把失败转成 nil,可能丢失错误原因;try! 在失败时崩溃。

Swift · 示例片段
enum TitleError: Error { case empty }func validate(title: String) throws {    if title.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty {        throw TitleError.empty    }}// 使用 Foundation;在保存动作中 do { try validate(title: title) } catch { ... }

用于理解当前概念的代码片段;部分示例需要放入对应工程与作用域,并补齐上下文。

保存失败如何变成用户能理解的结果

  1. 校验函数发现标题为空时抛出明确的业务错误,避免数据库层再产生难懂的错误。
  2. 页面的保存动作捕获错误,保留编辑内容并显示提示。成功后才关闭编辑页,不要在 defer 中无条件关闭。
  3. 记录调试上下文时保留错误类别和操作名称,不把用户输入全文写入日志。

这里需要你亲自判断

不要用 try? 隐藏需要向用户解释的失败,例如保存失败或购买失败。

做一个小练习

写一个对空字符串抛出错误的函数,并用 do/catch 展示失败信息。

  1. 实现空标题会失败的校验函数,并在调用位置分别走成功和 catch 分支。
  2. 找出一处 try?,判断丢失错误原因是否会使界面错误地显示保存成功。
展开参考思路与验收标准

合法标题正常返回;空标题在页面保留输入并提示补全。错误处理应形成产品行为,不能只是 print(error) 后继续执行成功流程。

哪种方式更适合保留保存失败的原因?

继续查阅官方资料
Swift 官方文档

本课聚焦核心认知。具体 API、系统要求与发布政策,以当前官方文档和工程验证为准。

答对理解题后即可标记完成