ENIGMA AI
ENIGMA AI
iOS Средний

В чём отличие @State от @Binding в SwiftUI?

@State vs @Binding в SwiftUI

@State

Владение данными — источник истины (source of truth).

struct CounterView: View {
    @State private var count = 0  // Владеет данными

    var body: some View {
        VStack {
            Text("Count: \(count)")
            Button("Increment") {
                count += 1  // Изменение вызывает перерисовку
            }
        }
    }
}

@Binding

Ссылка на данные — двусторонняя связь с источником.

struct ChildView: View {
    @Binding var value: Int  // Ссылка на @State родителя

    var body: some View {
        Button("Change in child") {
            value += 1  // Изменяет данные родителя
        }
    }
}

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

    var body: some View {
        VStack {
            Text("Count: \(count)")
            ChildView(value: $count)  // Передаём binding
        }
    }
}

Ключевые отличия:

Аспект @State @Binding
Владение Да Нет
Источник Source of truth Derived
Инициализация Значением Binding ($)
Область Private (обычно) Может быть public
Хранение В View Ссылка

Правила использования:

  1. @State — для локального состояния, которым владеет View
  2. @Binding — для передачи состояния дочерним View
  3. $ — создаёт Binding из State

Создание Binding вручную:

// Constant binding (для preview)
TextField("Name", text: .constant("Preview"))

// Custom binding
let customBinding = Binding(
    get: { self.value },
    set: { newValue in
        self.value = newValue
        self.validate(newValue)
    }
)

Другие property wrappers:

  • @StateObject — владение ObservableObject
  • @ObservedObject — ссылка на ObservableObject
  • @EnvironmentObject — из environment
  • @Environment — системные значения

Похожие вопросы

Готовитесь к собеседованию?

ENIGMA AI — невидимый ИИ-помощник для технических интервью

Попробовать бесплатно
Все вопросы