В чем разница между @State и @ObservedObject в SwiftUI?

Ответ

@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 — общее, на всех. Для сложных, разделяемых моделей-уродов. Ты за ним только следишь, а живёт оно где-то снаружи.

Всё, понял? Иди, пробуй, а то опять всё перепутаешь, хитрая жопа!