Ответ
@State и @ObservedObject — это property wrappers для управления состоянием, но с разными областями применения.
@State
- Назначение: Хранение локального, приватного состояния внутри конкретной
View. - Типы данных: Примитивы (
Int,String,Bool) или value-типы (struct,enum). SwiftUI управляет памятью. - Область видимости: Данные принадлежат и уничтожаются вместе с View.
- Использование: Для простого состояния, не выходящего за пределы View.
struct CounterView: View {
@State private var count = 0 // Локальное состояние
var body: some View {
Button("Tap: (count)") { count += 1 }
}
}
@ObservedObject
- Назначение: Подписка на изменения во внешнем, разделяемом источнике данных.
- Типы данных: Reference-типы (классы), conforming к
ObservableObject. Изменения в@Publishedсвойствах объекта приводят к обновлению View. - Владение: View не владеет объектом, а лишь наблюдает за ним. Объект должен быть передан извне (например, родительской View или окружения).
- Использование: Для сложных моделей данных, используемых несколькими View.
class UserSettings: ObservableObject {
@Published var username = "Alex"
}
struct ProfileView: View {
@ObservedObject var settings: UserSettings // Внешний источник данных
var body: some View {
TextField("Name", text: $settings.username)
}
}
Ключевое отличие: @State — для локального состояния View, @ObservedObject — для наблюдения за внешним, разделяемым объектом.
Ответ 18+ 🔞
А, ну вот, опять про эти обёртки, блядь! Сейчас я тебе так разжую, что ты, сука, на всю жизнь запомнишь, в рот меня чих-пых!
Смотри, есть у тебя @State. Это как твоя личная, блядь, заначка в носке. Деньги там, мелочь какая-то, на пиво. Только ты про неё знаешь, и живёт она строго в этом самом носке. Как только носок в стирку — всё, пипец заначке. Это для примитивов твоих: Int, String, Bool или для своих struct-ов. SwiftUI сам за этим хозяйством следит, ты только пользуйся.
struct MySecretView: View {
@State private var mySecretNumber = 42 // Моё, сука, приватное, никому не покажу!
var body: some View {
Button("Тыкни: (mySecretNumber)") { mySecretNumber += 1 }
}
}
А теперь, внимание, ёпта! @ObservedObject — это уже не твой носок, блядь. Это как общий холодильник на всю коммуналку. В нём лежит колбаса, и за ней наблюдают, сука, все жильцы. Холодильник — это class, который подписан на протокол ObservableObject. А колбаса в нём — это свойство с пометкой @Published.
Твоя вьюха (View) — это просто один из жильцов. Она не владеет холодильником, о нет! Она лишь, блядь, наблюдает за ним (Observed). Холодильник ей кто-то извне подсовывает — сосед, родительская вьюха или ещё какой пидарас. И если в холодильнике колбасу сожрали, все жильцы сразу об этом узнают и начинают орать.
// Общий холодильник на всех
class CommunalFridge: ObservableObject {
@Published var sausageLeft = 100 // грамм, блядь
}
// Один из наблюдающих жильцов
struct HungryNeighborView: View {
@ObservedObject var fridge: CommunalFridge // Смотри, не твой! За ним только следим.
var body: some View {
Text("Осталось колбасы: (fridge.sausageLeft)г. Жрите аккуратнее, твари!")
}
}
Итог, ёперный театр:
@State— твоё личное, в штанах. Для мелкого, локального дерьма. Уничтожается с вьюхой.@ObservedObject— общее, на всех. Для сложных, разделяемых моделей-уродов. Ты за ним только следишь, а живёт оно где-то снаружи.
Всё, понял? Иди, пробуй, а то опять всё перепутаешь, хитрая жопа!