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))"
            }
        }
    }
}