LESSON 10 / 576 分钟
函数、闭包与错误处理
读懂参数标签、尾随闭包和 throws,就能理解大部分框架调用。
用你的前端经验理解
闭包类似箭头函数;try/catch 对应 do/try/catch,但 Swift 的可抛错函数需要声明 throws。
01 / 理解问题
为什么需要它
函数签名就是调用者与实现之间的契约:需要什么输入、返回什么、是否可能失败、是否需要等待。Swift 的参数标签让调用位置更接近自然语言。闭包则把一段行为当作值传递,按钮回调、集合转换和异步完成处理都会用到它;阅读时先确认它何时执行以及捕获了谁。
它是怎样工作的
throws 表示错误可以沿调用链向上传递,调用方用 try 和 do/catch 处理。try? 会把失败转换成 nil,适合确实不关心原因的尝试;try! 则假定不会失败。逃逸闭包可能在函数返回后才执行,捕获对象可能延长其生命周期;是否需要 weak self 要根据实际引用关系判断,不能机械地给每个闭包添加。
02 / 掌握要点
把关键概念连起来
1
参数
参数标签是 API 可读性的一部分。func greet(to name: String) 用 greet(to: "Lin") 调用;_ 省略外部标签。
2
闭包
{ value in ... } 定义闭包;$0 表示第一个参数。尾随闭包只是调用语法,不会自动异步执行。
3
错误
try 传播或捕获错误;try? 把失败转成 nil,可能丢失错误原因;try! 在失败时崩溃。
READ THE CODE
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 { ... }用于理解当前概念的代码片段;部分示例需要放入对应工程与作用域,并补齐上下文。
03 / 案例推演
保存失败如何变成用户能理解的结果
- 校验函数发现标题为空时抛出明确的业务错误,避免数据库层再产生难懂的错误。
- 页面的保存动作捕获错误,保留编辑内容并显示提示。成功后才关闭编辑页,不要在 defer 中无条件关闭。
- 记录调试上下文时保留错误类别和操作名称,不把用户输入全文写入日志。
这里需要你亲自判断
不要用 try? 隐藏需要向用户解释的失败,例如保存失败或购买失败。
04 / 动手验证
做一个小练习
写一个对空字符串抛出错误的函数,并用 do/catch 展示失败信息。
- 实现空标题会失败的校验函数,并在调用位置分别走成功和 catch 分支。
- 找出一处 try?,判断丢失错误原因是否会使界面错误地显示保存成功。
展开参考思路与验收标准
合法标题正常返回;空标题在页面保留输入并提示补全。错误处理应形成产品行为,不能只是 print(error) 后继续执行成功流程。
05 / 检查理解
哪种方式更适合保留保存失败的原因?
答对理解题后即可标记完成