Изучение данного блока предполагает предварительное знание синтаксиса языка Swift. Для успешного освоения этого материала, необходимо иметь базовое понимание синтаксиса языка Swift. Это включает в себя знание основных структур данных, операторов, циклов, функций, абстракций и других ключевых элементов языка. Без этих фундаментальных знаний будет сложно понять более сложные концепции и примеры, которые будут рассматриваться в данном блоке.


Что такое Property Wrappers в SwiftUI?

В контексте SwiftUI, property wrappers играют ключевую роль в управлении состоянием и данными, а также обеспечивают взаимодействие между пользовательским интерфейсом и моделью данных.

Как это работает?

Под капотом, компилятор Swift генерирует код, который преобразует аннотированные свойства в более сложные конструкции. В каждом случае генерируется скрытое свойство для хранения состояния обертки, а доступ к основному свойству осуществляется через геттеры и сеттеры wrappedValue.

Swift выполняет эту трансформацию на уровне компиляции. Это означает, что никакие дополнительные объекты или данные не создаются во время выполнения — все необходимое генерируется и оптимизируется компилятором во время сборки.

Основные Property Wrappers в SwiftUI

@State

Он используется для управления локальным состоянием внутри представления. Когда значение свойства изменяется, представление автоматически перерисовывается.

struct CounterView: View {
    @State private var count = 0

    var body: some View {
        VStack {
            Text("Count: \\(count)")
            Button("Increment") {
                count += 1
            }
        }
    }
}

@Binding

Когда локальное состояние(@State) нужно передать в дочернее и позволить ему изменять его, используется @Binding. Таким образом, @Binding передает ссылку на значение, а не само значение. Это позволяет дочернему представлению напрямую изменять состояние родительского представления.

struct ToggleView: View {
    @Binding var isOn: Bool

    var body: some View {
        Toggle("Toggle", isOn: $isOn)
    }
}

@Published