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@Statepromenne 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@Statenebo 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í protokolObservableObject. Změny označených@Publishedvlastností 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í instanceObservableObjectuvnitr 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 instanceObservableObjectv 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) } }