Sobes.tech
Middle

Czym jest stan, obiekt stanu i obserwowany obiekt w rozwoju iOS?

sobes.tech AI

Odpowiedź od AI

State — to opakowanie właściwości w SwiftUI, które pozwala zarządzać lokalnym stanem widoku. Przy zmianie wartości właściwości opakowanej w @State, widok jest automatycznie odświeżany.

StateObject — to opakowanie właściwości w SwiftUI do tworzenia i zarządzania obiektami spełniającymi protokół ObservableObject, które są częścią cyklu życia widoku. Efektywne dla obiektów tworzonych wewnątrz widoku i z nim żyjących.

ObservedObject — to opakowanie właściwości w SwiftUI do zarządzania odwołaniami do istniejących obiektów spełniających protokół ObservableObject, które zostały z zewnątrz przekazane. SwiftUI śledzi zmiany w tych obiektach i odświeża widok.

Tabela porównawcza:

Opakowanie Przeznaczenie Własność Przykład użycia
@State Lokalny stan widoku Widok Prosty licznik, flaga widoczności
@StateObject Tworzenie i własność ObservableObject Widok Model widoku (ViewModel) tworzony w widoku
@ObservedObject Śledzenie ObservableObject przekazanego Zewnętrzne źródło Model widoku (ViewModel) przekazany z rodzica

Przykład użycia @State:

struct CounterView: View {
    @State private var count: Int = 0 // Lokalny stan

    var body: some View {
        VStack {
            Text("Count: \(count)")
            Button("Zwiększ") {
                count += 1 // Zmiana stanu powoduje odświeżenie
            }
        }
    }
}

Przykład użycia @StateObject i @ObservedObject:

import SwiftUI

// ObservableObject dla modelu danych
class DataModel: ObservableObject {
    @Published var value: String
    
    init(value: String) {
        self.value = value
    }
}

struct ContentView: View {
    // Tworzenie i posiadanie instancji DataModel
    @StateObject private var localData = DataModel(value: "Wartość początkowa")

    var body: some View {
        VStack {
            Text("Dane lokalne: \(localData.value)")
            Button("Zmień dane lokalne") {
                localData.value = "Zmienione dane lokalne \(Int.random(in: 1...100))"
            }
            
            // Przekazanie localData do widoku potomnego
            ChildView(observedData: localData)
        }
    }
}

struct ChildView: View {
    // Śledzenie instancji DataModel przekazanej od rodzica
    @ObservedObject var observedData: DataModel

    var body: some View {
        VStack {
            Text("Obserwowane dane w dziecku: \(observedData.value)")
            Button("Zmień dane w dziecku") {
                observedData.value = "Zmienione z dziecka \(Int.random(in: 1...100))"
            }
        }
    }
}