Menu
CoddyTech

可观察对象

本课属于 Coddy Swift 学习旅程的“SwiftUI 入门”单元。第 40 课,共 50 课。

多个视图共享的数据,或有自身逻辑的数据,应放在类中。它遵循 ObservableObject,屏幕显示的每个属性都标记为 @Published:

class Cart: ObservableObject {
    @Published var count = 0

    func add() {
        count += 1
    }
}

创建对象的视图会使用 @StateObject 保存它。视图显示在屏幕上时,SwiftUI 会让这个对象保持存活,并在已发布的属性发生变化时重新绘制视图:

struct ContentView: View {
    @StateObject private var cart = Cart()

    var body: some View {
        VStack {
            Text("Items: \(cart.count)")
            Button("Add to cart") {
                cart.add()
            }
        }
    }
}

从父视图接收现有对象的子视图则将其标记为 @ObservedObject:它会监视该对象,但不拥有该对象。

challenge icon

挑战

中等

Scoreboard 类没有与屏幕连接。让它成为一个 ObservableObject,并包含一个 @Published 的 points,使用 @StateObject 将它存储在 ContentView 中,并让按钮调用 scoreboard.score()。点击一次后,文本必须显示 Points: 10。

亲手试试

import SwiftUI

@main
struct CoddyApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

SwiftUI 入门中的所有课

自己练习: SwiftUI 在线编辑器