Sobes.tech
Middle

Стейт, объекти стейт ва объекти мушоҳидашуда дар таҳияи iOS чист?

sobes.tech AI

Ҷавоб аз 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: "Начальная локальная значение")

    var body: some View {
        VStack {
            Text("Локальные данные: \(localData.value)")
            Button("Изменить локальные данные") {
                localData.value = "Измененное локальное значение \(Int.random(in: 1...100))"
            }
            
            // Передаем localData в дочернее представление
            ChildView(observedData: localData)
        }
    }
}

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

    var body: some View {
        VStack {
            Text("Следимые данные в ребенке: \(observedData.value)")
            Button("Изменить следимые данные") {
                observedData.value = "Изменено из ребенка \(Int.random(in: 1...100))"
            }
        }
    }
}