LESSON 07 / 576 分钟
Optional:把“可能没有”写进类型
String? 表示有一个字符串,或者没有值 nil。先处理缺失,之后才能使用内部值。
用你的前端经验理解
类似 TypeScript 的 string | undefined,但 Swift 把可选值作为 Optional 类型处理,并要求明确解包。
01 / 理解问题
为什么需要它
Optional 用类型表达“这里可能没有值”。用户未设置昵称、字典里不存在某个键、文本不能解析成整数,都是正常的缺失场景。它与空字符串、0 和失败异常不是同一件事:年龄为空可能是尚未填写,年龄为 0 则是一个实际值。保留这个区别能减少业务歧义。
它是怎样工作的
if let 适合有值时进入局部分支;guard let 适合函数入口检查,缺失时提前返回;?? 适合确有业务意义的默认值。可选链在中途遇到 nil 就停止访问,结果仍可能为空。强制解包 ! 相当于承诺值必定存在,如果承诺不成立就会触发运行时错误,不能把它当成消除类型提示的通用方案。
02 / 掌握要点
把关键概念连起来
1
安全解包
if let 在分支里拿到非可选值;guard let 常在函数入口提前返回,让后续逻辑保持平坦。
2
默认值
?? 在没有值时提供备用值;?. 允许可选链,结果仍可能是 Optional。
3
强制解包
! 不是“告诉编译器别管”,而是运行时承诺有值。值为 nil 时会崩溃。
READ THE CODE
Swift · 示例片段
func validDays(_ text: String) -> Int? { guard let days = Int(text), days > 0 else { return nil } return days}- 这个最小函数只返回可用值或 nil;需要不同错误文案时可升级为 throws 或结果枚举。
用于理解当前概念的代码片段;部分示例需要放入对应工程与作用域,并补齐上下文。
03 / 案例推演
解析阅读目标输入
- 输入框给出 String。Int(text) 返回 Int?,因为用户可以输入 abc、空白或超出范围的数字。
- 先用 guard let 判断是否可解析,再判断天数是否大于 0。这是语法合法性与业务合法性两道检查。
- 不合法时显示明确提示并保留输入,不能用 ?? 0 把所有错误转换成零天,然后继续保存。
这里需要你亲自判断
网络响应、用户输入和系统返回值不适合盲目使用 !。
04 / 动手验证
做一个小练习
打开交互实验室,在有昵称和 nil 两种状态下观察 ?? 的输出。
- 分别输入 7、abc 和 0,写出每种情况应该到达的分支。
- 为可选昵称提供“未设置昵称”的展示,但不要把这个占位文案写回真实昵称字段。
展开参考思路与验收标准
7 可以保存;abc 是解析失败;0 是解析成功但不符合业务规则。能区分这两类错误,就不会把 Optional 的职责错误地扩大为完整的数据校验。
05 / 检查理解
nickname 为 nil 时,nickname ?? "访客" 返回什么?
答对理解题后即可标记完成