Middle+
Nevezze meg azt a property wrapper-t, amely kijelenti a hivatkozás szemantikáját.
sobes.tech MI
Válasz az MI-től
@State@Binding@EnvironmentObject@ObservedObject@StateObject
Ezek a property wrapper-ek nem deklarálják a hivatkozás szemantikáját a hagyományos értelemben (mint egy mutató C++-ban), de lehetővé teszik az adatokkal való munkát, amelyeket a SwiftUI "hivatkozásként" vagy közös mutable igazságforrásként jelenít meg. Kezelik az adatok életciklusát és automatikus UI-frissítést biztosítanak azok változásakor.
Példák:
@State: A View belső állapotát kezeli. Az@Stateváltozó módosítása újrarajzolást eredményez.struct MyView: View { @State private var isActive = false var body: some View { Button("Toggle") { isActive.toggle() } } }@Binding: Kétirányú kötést hoz létre@State-hez vagy más adatforráshoz. A változások egyik helyen megjelennek a másikon.struct ParentView: View { @State private var value = 0 var body: some View { VStack { Text("Value: \(value)") ChildView(count: $value) // $ kötést hoz létre } } } struct ChildView: View { @Binding var count: Int // Bindinget kap var body: some View { Button("Increment") { count += 1 // Binding módosítása } } }@ObservedObject: Olyan referenciatípusokra (osztályokra) használják, amelyek azObservableObjectprotokollt valósítják meg. A@Published-tel jelölt tulajdonságok változásai frissítik a View-t.import Combine class Counter: ObservableObject { @Published var count = 0 } struct ContentView: View { @ObservedObject var counter = Counter() // Referenciatípus var body: some View { VStack { Text("Count: \(counter.count)") Button("Increment") { counter.count += 1 } } } }@StateObject: Hasonló az@ObservedObject-hez, de arra szolgál, hogy egyObservableObjectpéldányt hozzon létre a View-ban, és kezelje az életciklusát. A View a tulajdonosa az objektumnak.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() // Objektum létrehozása és tulajdonlása var body: some View { Text("Time: \(timerData.timerSeconds)") } }@EnvironmentObject: Lehetővé tesziObservableObjectpéldányok átadását a View hierarchiában anélkül, hogy azokat minden View konstruktorán keresztül át kellene adni.import Combine class UserSettings: ObservableObject { @Published var loggedIn = false } struct AppView: View { @StateObject var settings = UserSettings() var body: some View { ContentView() .environmentObject(settings) // Környezetbe injektálás } } struct ContentView: View { @EnvironmentObject var settings: UserSettings // Környezetből elérhető var body: some View { Toggle("Logged In", isOn: $settings.loggedIn) } }