Sobes.tech
Middle

Τι είναι το state, το state object και το observed object στην ανάπτυξη 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))"
            }
        }
    }
}