Menu
Coddy logo textTech

Наблюдаемые объекты

Часть раздела Введение в SwiftUI путешествия по Swift на Coddy. Урок 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, сохраните его в ContentView с помощью @StateObject и сделайте так, чтобы кнопка вызывала scoreboard.score(). После одного нажатия текст должен отображать Points: 10.

Попробуйте сами

import SwiftUI

@main
struct CoddyApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Введение в SwiftUI

Потренируйтесь самостоятельно: Песочница Swift