Middle+
Pavadinkite savybės apvyniojimus, kurie deklaruoja nuorodos semantiką.
sobes.tech AI
Atsakymas iš AI
@State@Binding@EnvironmentObject@ObservedObject@StateObject
Šie property wrapper'iai nesukelia nuorodos semantikos tradiciniame supratime (kaip rodyklė C++), tačiau leidžia dirbti su duomenimis, kurie SwiftUI pateikiami kaip "nuorodos" arba bendri mutable šaltiniai. Jie valdo duomenų gyvavimo ciklą ir užtikrina automatinį UI atnaujinimą jų pakeitimu.
Pavyzdžiui:
@State: valdo vietinę būseną View viduje.@Statekintamojo pakeitimas sukelia View perpiešimą.struct MyView: View { @State private var isActive = false var body: some View { Button("Toggle") { isActive.toggle() } } }@Binding: leidžia sukurti dvipusį ryšį su@Statearba kitu duomenų šaltiniu. Pakeitimai vienoje vietoje atsispindi kitoje.struct ParentView: View { @State private var value = 0 var body: some View { VStack { Text("Value: \(value)") ChildView(count: $value) // $ sukuria Binding } } } struct ChildView: View { @Binding var count: Int // gauname Binding var body: some View { Button("Increment") { count += 1 // Pakeisti Binding } } }@ObservedObject: naudojamas nuorodų tipams (klasėms), kurie įgyvendinaObservableObjectprotokolą. Pakeitimai@Publishedsavybėse šiame objekte sukelia View atnaujinimą.import Combine class Counter: ObservableObject { @Published var count = 0 } struct ContentView: View { @ObservedObject var counter = Counter() // nuorodinis tipas var body: some View { VStack { Text("Count: \(counter.count)") Button("Increment") { counter.count += 1 } } } }@StateObject: panašus į@ObservedObject, tačiau skirtas kurtiObservableObjectegzempliorių View viduje ir valdyti jo gyvavimo ciklą. View tampa objekto savininku.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() // objekto kūrimas ir valdymas var body: some View { Text("Time: \(timerData.timerSeconds)") } }@EnvironmentObject: leidžia perduotiObservableObjectegzempliorius View hierarchijoje, neperduodant jų per kiekvieno View inicializatorius.import Combine class UserSettings: ObservableObject { @Published var loggedIn = false } struct AppView: View { @StateObject var settings = UserSettings() var body: some View { ContentView() .environmentObject(settings) // įdiegimas į aplinką } } struct ContentView: View { @EnvironmentObject var settings: UserSettings // prieiga iš aplinkos var body: some View { Toggle("Logged In", isOn: $settings.loggedIn) } }