Sobes.tech
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 @State vá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 az ObservableObject protokollt 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 egy ObservableObject pé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é teszi ObservableObject pé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)
        }
    }