Sobes.tech
Middle+

Uveďte property wrappery, které deklarují sémantiku odkazu.

sobes.tech AI

Odpověď od AI

  • @State
  • @Binding
  • @EnvironmentObject
  • @ObservedObject
  • @StateObject

Tyto property wrappery nezve deklaraci semantiky odkazu v tradicnim smyslu (jako ukazatel v C++), ale umoznují pracovat s daty prezentovanými ve SwiftUI jako " odkazy" nebo spolecné mutable zdroje pravdy. Řídí životní cyklus dat a zajišťují automatické aktualizace UI pri jejich zmene.

Například:

  • @State: Řídí lokální stav uvnitr View. Zmena @State promenne vede k prekreslení View.
    struct MyView: View {
        @State private var isActive = false
    
        var body: some View {
            Button("Toggle") {
                isActive.toggle()
            }
        }
    }
    
  • @Binding: Umožňuje vytvorit obousměrné vazby k @State nebo jinému zdroji dat. Zmeny na jednom miste se odrážejí na druhém.
    struct ParentView: View {
        @State private var value = 0
    
        var body: some View {
            VStack {
                Text("Value: \(value)")
                ChildView(count: $value) // $ vytváří Binding
            }
        }
    }
    
    struct ChildView: View {
        @Binding var count: Int // Získává Binding
    
        var body: some View {
            Button("Increment") {
                count += 1 // Změna Binding
            }
        }
    }
    
  • @ObservedObject: Používá se pro odkazové typy (tridy), které implementují protokol ObservableObject. Změny označených @Published vlastností v tomto objektu vyvolávají aktualizaci View.
    import Combine
    
    class Counter: ObservableObject {
        @Published var count = 0
    }
    
    struct ContentView: View {
        @ObservedObject var counter = Counter() // Odkazový typ
    
        var body: some View {
            VStack {
                Text("Count: \(counter.count)")
                Button("Increment") {
                    counter.count += 1
                }
            }
        }
    }
    
  • @StateObject: Podobné jako @ObservedObject, ale určené pro vytváření instance ObservableObject uvnitr View a správu jeho životního cyklu. View se stává vlastníkem objektu.
    import Combine
    
    class TimerData: ObservableObject {
        @Published var timerSeconds = 0
    
        init() {
            Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { _ in
                self.timerSeconds += 1
            }
        }
    }
    
    struct TimerView: View {
        @StateObject var timerData = TimerData() // Vytvorení a vlastnictví objektu
    
        var body: some View {
            Text("Time: \(timerData.timerSeconds)")
        }
    }
    
  • @EnvironmentObject: Umožňuje předávat instance ObservableObject v hierarchii View, aniž bychom je předávali přes konstruktory každého View.
    import Combine
    
    class UserSettings: ObservableObject {
        @Published var loggedIn = false
    }
    
    struct AppView: View {
        @StateObject var settings = UserSettings()
    
        var body: some View {
            ContentView()
                .environmentObject(settings) // Vložení do prostředí
        }
    }
    
    struct ContentView: View {
        @EnvironmentObject var settings: UserSettings // Přístup z prostředí
    
        var body: some View {
            Toggle("Logged In", isOn: $settings.loggedIn)
        }
    }