Назад к вопросам
Middle
117
questionbank

Что такое state, state object и observed object в iOS-разработке?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

State — обертка свойства во SwiftUI, позволяющая управлять локальным состоянием представления. При изменении значения свойства, обернутого в @State, представление автоматически обновляется.

StateObject — обертка свойства во SwiftUI для создания и управления объектами, соответствующими протоколу ObservableObject, которые являются частью жизненного цикла представления. Эффективно для объектов, созданных внутри представления и живущих с ним.

ObservedObject — обертка свойства во SwiftUI для управления ссылками на существующие объекты, соответствующие протоколу ObservableObject, которые были переданы извне. SwiftUI следит за изменениями в этих объектах и обновляет представление.

Сравнительная таблица:

Обертка Назначение Владение Пример использования
@State Локальное состояние представления Представление Простой счетчик, флаг видимости
@StateObject Создание и владение ObservableObject Представление Модель представления (ViewModel), созданная в представлении
@ObservedObject Отслеживание ObservableObject, переданного Внешний источник Модель представления (ViewModel), переданная из родительского представления

Пример использования @State:

struct CounterView: View {
    @State private var count: Int = 0 // Локальное состояние

    var body: some View {
        VStack {
            Text("Count: \(count)")
            Button("Increment") {
                count += 1 // Изменение состояния вызывает обновление
            }
        }
    }
}

Пример использования @StateObject и @ObservedObject:

import SwiftUI

// ObservableObject для модели данных
class DataModel: ObservableObject {
    @Published var value: String
    
    init(value: String) {
        self.value = value
    }
}

struct ContentView: View {
    // Создаем и владеем экземпляром DataModel
    @StateObject private var localData = DataModel(value: "Initial Local Value")

    var body: some View {
        VStack {
            Text("Local Data: \(localData.value)")
            Button("Change Local Data") {
                localData.value = "Changed Local Value \(Int.random(in: 1...100))"
            }
            
            // Передаем localData в дочернее представление
            ChildView(observedData: localData)
        }
    }
}

struct ChildView: View {
    // Отслеживаем экземпляр DataModel, переданный из родителя
    @ObservedObject var observedData: DataModel

    var body: some View {
        VStack {
            Text("Observed Data in Child: \(observedData.value)")
            Button("Change Observed Data") {
                observedData.value = "Changed from Child \(Int.random(in: 1...100))"
            }
        }
    }
}