Все эти property wrapper-ы сообщают SwiftUI, и . Ключевое разделение — это (, ) против (, , ), плюс кто отвечает за время жизни объекта.
Все эти property wrapper-ы сообщают SwiftUI, и . Ключевое разделение — это (, ) против (, , ), плюс кто отвечает за время жизни объекта.
@State@Binding@StateObject@ObservedObject@EnvironmentObject// Состояние-значение, ПРИНАДЛЕЖАЩЕЕ этому представлению
struct Toggle: View {
@State private var isOn = false // локальный источник истины
var body: some View {
Switch(isOn: $isOn) // $ создаёт Binding
}
}
// Двусторонняя ссылка на состояние, которым владеют В ДРУГОМ МЕСТЕ
struct Switch: View {
@Binding var isOn: Bool // нет владения; читает+пишет родителя
var body: some View { Button("\(isOn)") { isOn.toggle() } }
}
final class CartModel: ObservableObject {
@Published var items: [Item] = [] // изменение => представления перерисовываются
}
struct CartScreen: View {
@StateObject private var model = CartModel() // ВЛАДЕЕТ: создан один раз, переживает перерисовки
var body: some View { CartList(model: model) }
}
struct CartList: View {
@ObservedObject var model: CartModel // наблюдает; владеет родитель
var body: some View { Text("\(model.items.count)") }
}
| Wrapper | Тип | Владение | Когда использовать |
|---|---|---|---|
@State | значение | это представление | простое локальное состояние |
@Binding | значение | родитель | ребёнок редактирует состояние родителя |
@StateObject | ссылка | это представление (создан один раз) | представление создаёт модель |
@ObservedObject | ссылка | в другом месте | модель передаётся извне |
@EnvironmentObject | ссылка | предок | общее глубоко в дереве |
@StateObject против @ObservedObject — классическая ловушка. Создание модели через @ObservedObject var m = Model() пересоздаёт её при каждой перерисовке, тихо теряя состояние. Используйте @StateObject везде, где представление создаёт объект.@EnvironmentObject падает во время выполнения, если ни один предок не внедрил его через .environmentObject(...).Выбор неправильного wrapper-а — источник багов состояния SwiftUI номер один: мерцающие значения, сбросы при прокрутке или представления, которые никогда не обновляются. Интервьюеры спрашивают это, потому что ответ про @StateObject против @ObservedObject мгновенно показывает, понимаете ли вы модель владения SwiftUI.
Библиотека вопросов для IT-собеседований с подробными ответами — от Junior до Senior.
Поддержать