CodeRoadMap
首页路线题库资源库文章社区
CodeRoadMap

程序员的学习成长路线图。内容免费开放,登录后可同步路线图与课时进度。

由 程序员柏风 独立维护 · 关于作者

学习

  • 路线图
  • 课程
  • 面试题
  • 文章
  • 我

更多

  • 资源
  • 社区
  • 关于作者
  • 内容说明

© 2026 CodeRoadMap

津ICP备2026012044号-1·津公网安备12011002026155号·coderoadmap@126.com
SwiftUI 开发入门/课时/函数与闭包
RawBlame
课时目录12 节

SwiftUI 开发入门

  1. 01Swift 与 SwiftUI 概览
  2. 02基础语法与类型
  3. 03控制流
  4. 04函数与闭包
  5. 05结构体、类与协议
  6. 06SwiftUI 视图
  7. 07状态管理
  8. 08导航与生命周期
  9. 09并发与 async/await
  10. 10数据持久化
  11. 11MVVM 与架构
  12. 12综合练习

函数与闭包

Trailing Closure、async 函数。

30 分钟

函数与闭包

Swift 函数是一等公民;闭包(Closure)可捕获上下文,是 SwiftUI 事件处理与异步编程的基础。对照 /roadmaps/swift-ui「函数与闭包」节点。

学习目标

  • 定义带参数标签、默认值与可变参数的函数
  • 理解闭包语法与 Trailing Closure
  • 掌握 @escaping 与捕获列表 [weak self]
  • 编写 async 函数并在 SwiftUI 中调用

核心概念

函数定义与参数

func formatDuration(minutes: Int, suffix: String = "分钟") -> String {
    return "\(minutes) \(suffix)"
}

func sum(_ numbers: Int...) -> Int {
    numbers.reduce(0, +)
}

// 多返回值(元组)
func parseLesson(_ raw: String) -> (id: Int, title: String)? {
    let parts = raw.split(separator: "|")
    guard parts.count == 2, let id = Int(parts[0]) else { return nil }
    return (id, String(parts[1]))
}

外部参数名提升可读性:formatDuration(minutes: 35);_ 省略外部标签。

闭包与 Trailing Closure

var lessons = ["语法", "控制流", "闭包"]

// 完整闭包
let sorted = lessons.sorted(by: { (a, b) -> Bool in
    a.count < b.count
})

// Trailing Closure:最后一个闭包参数可写在括号外
let sorted2 = lessons.sorted { $0.count < $1.count }

// SwiftUI 中常见
Button("排序") {
    lessons.sort { $0.count < $1.count }
}

$0、$1 是闭包参数简写;SwiftUI 的 .onTapGesture { }、.task { } 均使用 Trailing Closure。

async 函数

struct Lesson: Decodable {
    let id: Int
    let title: String
}

func fetchLesson(id: Int) async throws -> Lesson {
    try await Task.sleep(nanoseconds: 300_000_000)
    return Lesson(id: id, title: "课时 \(id)")
}

struct LessonLoaderView: View {
    @State private var lesson: Lesson?
    @State private var isLoading = false

    var body: some View {
        VStack(spacing: 16) {
            if isLoading {
                ProgressView()
            } else if let lesson {
                Text(lesson.title).font(.title2)
            }
            Button("加载") {
                Task {
                    isLoading = true
                    defer { isLoading = false }
                    lesson = try? await fetchLesson(id: 1)
                }
            }
        }
        .padding()
    }
}

async throws 函数用 try await 调用;SwiftUI 中用 Task { } 启动异步任务, 修饰符在视图出现时自动执行。

.task

与 React/SwiftUI 对照

SwiftReactSwiftUI
函数普通函数 / 箭头函数ViewModel 方法
Trailing Closure回调 props onClick={() =>}.onTapGesture { }
{ $0 in ... }(x) => ...sorted { $0 < $1 }
@escaping异步回调存 ref网络 completion
async/awaitasync/await.task { await load() }
Task { }useEffect 内 async IIFE按钮触发的异步

React 的 useCallback 缓存闭包;SwiftUI 中闭包通常随 View 重建,复杂逻辑应放入 ViewModel。

练习

  • 写 filterLessons(_:completed:) 高阶函数,接受闭包 predicate
  • 用 Trailing Closure 实现 .map 提取 lesson 标题数组
  • 编写 async throws 模拟网络请求,在 SwiftUI 按钮中触发
  • 对比 React useEffect 与 SwiftUI .task 生命周期

小结

闭包无处不在 + Trailing Closure 简化语法 + async 驱动 SwiftUI 加载。 下一课结构体、类与协议。见 swift-ui-essentials。

加载本节练习…
← 上一课控制流下一课 →结构体、类与协议