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综合练习

结构体、类与协议

struct/class、Protocol、ARC。

35 分钟

结构体、类与协议

Swift 是协议导向语言:struct 值类型用于模型,class 引用类型用于共享状态,protocol 定义能力契约。对照 /roadmaps/swift-ui「OOP」节点,这是 SwiftUI 数据建模与 ViewModel 的基础。

学习目标

  • 区分 struct 与 class 的语义与拷贝行为
  • 使用 protocol 与 extension 组织代码
  • 理解 ARC 与 weak/unowned 打破循环引用
  • 为 SwiftUI 模型实现 Identifiable、Codable

核心概念

struct vs class

struct Lesson: Identifiable, Codable, Equatable {
    let id: Int
    var title: String
    var completed: Bool
}

// 值类型:拷贝独立
var a = Lesson(id: 1, title: "语法", completed: false)
var b = a
b.completed = true
print(a.completed)  // false,a 不受影响

// 引用类型:共享实例
class LessonStore {
    var lessons: [Lesson] = []
    func markComplete(id: Int) {
        if let i = lessons.firstIndex(where: { $0.id == id }) {
            lessons[i].completed = true
        }
    }
}

let store1 = LessonStore()
let store2 = store1  // 同一实例
store2.lessons.append(Lesson(id: 1, title: "OOP", completed: false))
print(store1.lessons.count)  // 1

SwiftUI 模型优先 struct(线程安全、可预测);ViewModel 用 class + ObservableObject。

Protocol 与 Extension

protocol TrackDisplayable {
    var displayTitle: String { get }
    var lessonCount: Int { get }
}

struct Track: TrackDisplayable, Identifiable {
    let id: Int
    var title: String
    var lessons: [Lesson]

    var displayTitle: String { "📚 \(title)" }
    var lessonCount: Int { lessons.count }
}

extension Track {
    var completionRate: Double {
        guard !lessons.isEmpty else { return 0 }
        let done = lessons.filter(\.completed).count
        return Double(done) / Double(lessons.count)
    }
}

Protocol 支持组合能力;Extension 为已有类型添加计算属性与方法,无需继承。

ARC 与 weak

class NetworkManager {
    var onComplete: (() -> Void)?

    func fetch(completion: @escaping () -> Void) {
        onComplete = completion
        DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
            completion()
        }
    }
}

// 闭包捕获 self 时用 weak 避免循环引用
class LessonViewModel: ObservableObject {
    private let manager = NetworkManager()

    func load() {
        manager.fetch { [weak self] in
            self?.refreshUI()
        }
    }

    private func refreshUI() { /* 更新 @Published */ }
}

ObservableObject 本身是 class;闭包、delegate 捕获 self 时需 [weak self]。

与 React/SwiftUI 对照

SwiftReact / TSSwiftUI
structplain object / immutable data@State 模型、List 项
classclass instance / refObservableObject ViewModel
protocolinterfaceRepository 协议
extension模块 augmentationView Modifier 扩展
Identifiablekey propForEach 必需
CodableJSON.parse 类型API 解码
ARC / weak无(GC)ViewModel 闭包

React 函数组件 + 不可变 state 类似 struct 拷贝语义;Zustand/Context 的 store 类似 class 共享引用。

练习

  • 定义 Track struct,实现 Identifiable 与 completionRate 计算属性
  • 用 protocol 定义 LessonRepository,class 实现 mock 版本
  • 写一个闭包示例,演示 [weak self] 避免循环引用
  • 用 Codable 从 JSON 字符串解码 [Lesson]

小结

struct 建模 + protocol 抽象 + class 承载共享状态。 下一课 SwiftUI 视图。见 swift-ui-essentials。

加载本节练习…
← 上一课函数与闭包下一课 →SwiftUI 视图