控制流
if/switch/for、Optional Chaining。
25 分钟
控制流
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()
}
}