Middle+
Назовете property wrapper, който обявява семантиката на препратката.
sobes.tech AI
Отговор от AI
@State@Binding@EnvironmentObject@ObservedObject@StateObject
Тези property wrapper не обявяват семантиката на референцията в традиционното разбиране (като указател в C++), но позволяват работа с данни, представени в SwiftUI като "референции" или общи mutable източници на истина. Те управляват жизнения цикъл на данните и осигуряват автоматично обновяване на UI при тяхната промяна.
Например:
@State: Управлява локалното състояние вътре във View. Промяната на@Stateпроменлива води до повторно рисуване на View.struct MyView: View { @State private var isActive = false var body: some View { Button("Toggle") { isActive.toggle() } } }@Binding: Позволява създаване на двупосочна връзка към@Stateили друг източник на данни. Промените в едното място се отразяват в другото.struct ParentView: View { @State private var value = 0 var body: some View { VStack { Text("Value: \(value)") ChildView(count: $value) // $ създава Binding } } } struct ChildView: View { @Binding var count: Int // Получаваме Binding var body: some View { Button("Increment") { count += 1 // Промяна на Binding } } }@ObservedObject: Използва се за референтни типове (класове), които реализират протоколаObservableObject. Промяната на@Publishedсвойства в този обект води до обновяване на View.import Combine class Counter: ObservableObject { @Published var count = 0 } struct ContentView: View { @ObservedObject var counter = Counter() // Референтен тип var body: some View { VStack { Text("Count: \(counter.count)") Button("Increment") { counter.count += 1 } } } }@StateObject: Подобно на@ObservedObject, но предназначено за създаване на инстанцияObservableObjectвътре във View и управление на неговия жизнен цикъл. View става собственик на обекта.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() // Създаване и собственост на обекта var body: some View { Text("Time: \(timerData.timerSeconds)") } }@EnvironmentObject: Позволява предаване наObservableObjectинстанции в йерархията на View, без да ги предавате чрез конструкторите на всяко View.import Combine class UserSettings: ObservableObject { @Published var loggedIn = false } struct AppView: View { @StateObject var settings = UserSettings() var body: some View { ContentView() .environmentObject(settings) // Внедряване в околната среда } } struct ContentView: View { @EnvironmentObject var settings: UserSettings // Достъп от околната среда var body: some View { Toggle("Logged In", isOn: $settings.loggedIn) } }