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 | Ссылка |
Правила использования:
- @State — для локального состояния, которым владеет View
- @Binding — для передачи состояния дочерним View
- $ — создаёт 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 — невидимый ИИ-помощник для технических интервью
Попробовать бесплатно