← Назад к вопросам

Что такое @State?

1.2 Junior🔥 171 комментариев
#SwiftUI

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое @State в SwiftUI?

@State — это один из property wrapper'ов (оберток свойств) в SwiftUI, который предназначен для хранения и управления состоянием, принадлежащим конкретному представлению (View). Это фундаментальный механизм, позволяющий создавать реактивные пользовательские интерфейсы, где изменения данных автоматически отражаются в UI.

Основное назначение и характеристики

  1. Владение данными: Когда вы объявляете свойство с @State, SwiftUI берет на себя полное управление памятью для этого значения. Это означает, что фреймворк создает хранилище для этого свойства и обеспечивает его сохранность при обновлениях представления.

  2. Для примитивных или простых типов: @State идеально подходит для хранения простых типов данных, таких как String, Int, Bool, Double, а также для структур (struct), которые соответствуют протоколу Equatable. Обычно не используется для сложных объектов (классов) — для этого существуют @StateObject или @ObservedObject.

struct ContentView: View {
    @State private var counter = 0
    @State private var isOn = false
    @State private var text = ""
    
    var body: some View {
        VStack {
            Text("Counter: \(counter)")
            Toggle("Switch", isOn: $isOn)
            TextField("Enter text", text: $text)
        }
    }
}
  1. Изменчивость (мутабельность): Свойства, обернутые в @State, должны объявляться как private, поскольку они принадлежат и управляются исключительно этим представлением. Для изменения значения используется синтаксис $ (projected value), который предоставляет Binding — двустороннюю связь с данными.

Как это работает под капотом

Когда вы изменяете значение @State свойства, SwiftUI помечает соответствующее представление как "нуждающееся в обновлении". Затем система пересчитывает body этого представления и всех его дочерних элементов, которые зависят от этого состояния. Этот процесс оптимизирован для производительности.

struct CounterView: View {
    @State private var count = 0
    
    var body: some View {
        Button("Tap me: \(count)") {
            count += 1  // Изменение @State вызывает обновление UI
        }
    }
}

Практическое применение

  1. Управление UI-состоянием: Идеально для временного состояния интерфейса:

    • Видимость всплывающих окон (isShowingModal)
    • Выбор в сегментированном контроле (selectedTab)
    • Текст в полях ввода (username)
  2. Локальное состояние компонента: Каждый экземпляр View имеет свою независимую копию @State свойств.

struct CheckboxView: View {
    @State private var isChecked = false
    
    var body: some View {
        Image(systemName: isChecked ? "checkmark.square" : "square")
            .onTapGesture {
                isChecked.toggle()
            }
    }
}

Важные особенности

  • @State свойства всегда должны быть private — это гарантирует, что только само представление может изменять свое состояние.
  • Инициализация происходит один раз — при создании представления. Последующие изменения управляются SwiftUI.
  • Для производных значений используйте @DerivedValue или вычисляемые свойства.
  • Не используйте @State для ссылочных типов (классов) — для этого существуют @StateObject, @ObservedObject, @EnvironmentObject.

Отличие от других property wrapper'ов

  • @StateObject — для экземпляров классов, соответствующих ObservableObject (владеет объектом)
  • @ObservedObject — для наблюдения за внешним ObservableObject (не владеет им)
  • @Binding — для создания двусторонней связи с состоянием, принадлежащим родительскому представлению
  • @EnvironmentObject — для доступа к общим данным, предоставленным выше в иерархии

Пример с Binding

struct ParentView: View {
    @State private var childValue = ""
    
    var body: some View {
        VStack {
            Text("Parent value: \(childValue)")
            ChildView(text: $childValue) // Передаем Binding
        }
    }
}

struct ChildView: View {
    @Binding var text: String
    
    var body: some View {
        TextField("Type here", text: $text)
    }
}

Заключение

@State — это краеугольный камень управления состоянием в SwiftUI, предназначенный для локального, примитивного состояния, принадлежащего конкретному представлению. Его правильное использование обеспечивает реактивность интерфейса, когда изменения данных автоматически вызывают обновления UI без необходимости ручного управления. Понимание разницы между @State и другими property wrapper'ами критически важно для создания эффективных, поддерживаемых SwiftUI-приложений с правильно организованным потоком данных.

Что такое @State? | PrepBro