Sobes.tech
Middle

iOS өнүктүрүүдө state, state object жана observed object деген эмне?

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("Көбөйтүү") {
                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))"
            }
        }
    }
}