Sobes.tech
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)
        }
    }