大家好,我是程序员柏风,AI 最全的 Vibecoding 学习地图 http://coderoadmap.cn 作者。
控制流
Swift 控制流简洁且表达力强:if/guard、switch 模式匹配、for-in 循环。对照 /roadmaps/swift-ui「控制流」节点,这些语法在 SwiftUI 条件渲染与数据处理中频繁出现。
学习目标
- 掌握
if/else、guard提前退出 - 理解
switch的模式匹配与where子句 - 使用
for-in、while与区间Range - 在 SwiftUI 中应用条件视图
核心概念
if、guard 与可选绑定
func greetUser(name: String?, isVIP: Bool) -> String {
guard let name = name, !name.isEmpty else {
return "你好,访客"
}
if isVIP {
return "欢迎 VIP \(name)"
} else {
return "你好,\(name)"
}
}
// guard 常用于函数早期返回
func loadLesson(id: Int?) -> String? {
guard let id = id, id > 0 else { return nil }
return "课时 #\(id)"
}
guard 解包失败则退出当前作用域,保持后续代码简洁;SwiftUI ViewModel 中常用 guard 校验输入。
switch 模式匹配
enum LessonStatus {
case notStarted
case inProgress(percent: Int)
case completed
case locked(reason: String)
}
func statusLabel(for status: LessonStatus) -> String {
switch status {
case .notStarted:
return "未开始"
case .inProgress(let percent):
return "进行中 \(percent)%"
case .completed:
return "已完成"
case .locked(let reason):
return "已锁定:\(reason)"
}
}
// 区间与 where
func grade(score: Int) -> String {
switch score {
case 90...100: return "优秀"
case 70..<90: return "良好"
case 0..<70 where score >= 60: return "及格"
default: return "不及格"
}
}
Swift switch 必须穷尽所有 case,无需 break;枚举 + switch 是 SwiftUI 状态机常见写法。
循环与 SwiftUI 条件视图
struct LessonProgressView: View {
let lessons: [(title: String, done: Bool)]
let status: LessonStatus
var body: some View {
VStack(alignment: .leading, spacing: 12) {
Text(statusLabel(for: status))
.font(.headline)
ForEach(Array(lessons.enumerated()), id: \.offset) { index, lesson in
HStack {
Image(systemName: lesson.done ? "checkmark.circle.fill" : "circle")
Text("\(index + 1). \(lesson.title)")
}
}
if case .inProgress(let percent) = status {
ProgressView(value: Double(percent), total: 100)
} else if case .locked = status {
Text("请先完成前置课时")
.foregroundStyle(.secondary)
}
}
.padding()
}
}
SwiftUI 中 if/switch 直接写在 body 内实现条件 UI,类似 React 的 {condition && <Component />}。
与 React/SwiftUI 对照
| Swift 控制流 | React 等价 | SwiftUI 用法 |
|---|---|---|
if let | 条件渲染前校验 | 解包可选数据 |
guard else | early return | ViewModel 校验 |
switch 枚举 | switch / 对象映射 | 状态 → 视图分支 |
for-in | .map() / for...of | 数据预处理 |
if in body | {cond && <View />} | 条件显示组件 |
ForEach | .map(key => ...) | 列表渲染 |
React 的三元 {done ? <Check /> : <Circle />} 对应 SwiftUI 的 if/else 或三元 Group。
练习
- 定义
LessonStatus枚举,用 switch 返回对应 SF Symbol 名称 - 写
guard函数校验邮箱格式非空且含@ - 在 SwiftUI View 中用
if case显示不同进度 UI - 用
for-in计算已完成课时占比
小结
guard 提前退出 + switch 穷尽匹配 + body 内条件视图。 下一课函数与闭包。见 swift-ui-essentials。