LESSON 07 / 576 分钟

Optional:把“可能没有”写进类型

String? 表示有一个字符串,或者没有值 nil。先处理缺失,之后才能使用内部值。

用你的前端经验理解

类似 TypeScript 的 string | undefined,但 Swift 把可选值作为 Optional 类型处理,并要求明确解包。

为什么需要它

Optional 用类型表达“这里可能没有值”。用户未设置昵称、字典里不存在某个键、文本不能解析成整数,都是正常的缺失场景。它与空字符串、0 和失败异常不是同一件事:年龄为空可能是尚未填写,年龄为 0 则是一个实际值。保留这个区别能减少业务歧义。

它是怎样工作的

if let 适合有值时进入局部分支;guard let 适合函数入口检查,缺失时提前返回;?? 适合确有业务意义的默认值。可选链在中途遇到 nil 就停止访问,结果仍可能为空。强制解包 ! 相当于承诺值必定存在,如果承诺不成立就会触发运行时错误,不能把它当成消除类型提示的通用方案。

把关键概念连起来

1

安全解包

if let 在分支里拿到非可选值;guard let 常在函数入口提前返回,让后续逻辑保持平坦。

2

默认值

?? 在没有值时提供备用值;?. 允许可选链,结果仍可能是 Optional。

3

强制解包

! 不是“告诉编译器别管”,而是运行时承诺有值。值为 nil 时会崩溃。

Swift · 示例片段
func validDays(_ text: String) -> Int? {    guard let days = Int(text), days > 0 else { return nil }    return days}
  • 这个最小函数只返回可用值或 nil;需要不同错误文案时可升级为 throws 或结果枚举。

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

解析阅读目标输入

  1. 输入框给出 String。Int(text) 返回 Int?,因为用户可以输入 abc、空白或超出范围的数字。
  2. 先用 guard let 判断是否可解析,再判断天数是否大于 0。这是语法合法性与业务合法性两道检查。
  3. 不合法时显示明确提示并保留输入,不能用 ?? 0 把所有错误转换成零天,然后继续保存。

这里需要你亲自判断

网络响应、用户输入和系统返回值不适合盲目使用 !。

做一个小练习

打开交互实验室,在有昵称和 nil 两种状态下观察 ?? 的输出。

  1. 分别输入 7、abc 和 0,写出每种情况应该到达的分支。
  2. 为可选昵称提供“未设置昵称”的展示,但不要把这个占位文案写回真实昵称字段。
展开参考思路与验收标准

7 可以保存;abc 是解析失败;0 是解析成功但不符合业务规则。能区分这两类错误,就不会把 Optional 的职责错误地扩大为完整的数据校验。

打开对应交互实验

nickname 为 nil 时,nickname ?? "访客" 返回什么?

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

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

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