Почему в SwiftUI представления (View) реализованы как структуры (struct), а не классы?

Ответ

Использование value-типов (struct) для View в SwiftUI — это фундаментальный дизайнерский выбор, обеспечивающий производительность, безопасность и простоту.

Ключевые причины:

  1. Производительность и value-семантика: Структуры дешевле создавать и уничтожать. SwiftUI часто перестраивает дерево представлений в ответ на изменение данных. Легковесные struct позволяют делать это без накладных расходов на управление памятью (как у классов).
  2. Безопасность состояний: Поскольку структуры копируются при изменении, исключаются неявные разделяемые мутабельные состояния между частями UI, что является частой причиной багов.
  3. Детерминированное сравнение: SwiftUI использует диффинг для эффективного обновления интерфейса. Value-типы с автоматической реализацией Equatable для своих свойств позволяют системе легко определить, изменилось ли представление и нужно ли его перерисовывать.
  4. Потокобезопасность: Копирование значений безопасно в многопоточной среде, что упрощает работу фреймворка.

Пример:

// View — это struct. Изменение `count` создает новую копию структуры.
struct CounterView: View {
    var count: Int
    var body: some View {
        Text("Count: (count)")
    }
}

Для хранения и управления изменяемым состоянием используется специальный reference-тип — StateObject (для моделей), в то время как само описание UI остается value-типом.

Ответ 18+ 🔞

Да ты посмотри, какая хитрая жопа у этих свифтуюшников! Сидят, блядь, думают: "А давайте-ка мы все вьюхи сделаем структурами, а не классами!" И ведь не просто так, а с подковыркой, ёпта.

Смотри, в чём прикол-то. Представь, у тебя интерфейс меняется каждую секунду, как задница у обезьяны на жаре. Если бы каждый чих — это был новый тяжёлый объект-класс, то твой айфон через пять минут накрылся бы медным тазом, просто от попыток память почистить. А структура — она лёгкая, как пук ветра. Создалась, отработала, скопировалась если что — и нет её. Ни тебе ссылок, ни тебе утечек. Производительность, блядь, овердохуищная!

А второе — это безопасность, ёбта. С классами вечная беда: взял один объект, потыкал в него из десяти мест — и хрен поймёшь, кто и где его состояние сломал. Проснёшься утром, а у тебя кнопка вместо "Купить" показывает "Нахуй иди". А структура, сука, она при любом чихе копируется. Изменил — получил новую. Старая цела. Никаких неожиданных пиздецов на ровном месте. Это ж как в армии: у каждого свои трусы, не носишь чужие и в жопу не даёшь.

И главный фокус: как SwiftUI понимает, что перерисовывать? А он просто сравнивает, изменилась ли структура вьюхи с прошлого раза. А так как она value-тип, то сравнение — раз плюнуть. Изменился счётчик — структура новая, значит, текст надо обновить. Не изменилось — сиди, не еби мозги, ничего не делай. Гениально и просто, как тапок.

Вот смотри, наглядный пиздец:

// Это ж не класс, а struct! Меняется count — рождается новая копия всей вьюхи.
struct CounterView: View {
    var count: Int
    var body: some View {
        Text("Счётчик: (count)")
    }
}

Но и тут, конечно, без подлянки не обошлось. Состояние-то где хранить, если всё постоянно копируется? А для этого у них есть свои штуки, вроде StateObject или State. Это уже reference-типы, под капотом, которые тихо-мирно сидят в углу и хранят данные. А вьюхи — они только смотрят на эти данные и рисуют картинку. Разделение, блядь, обязанностей! UI — лёгкий и тупой, а мозги — отдельно, в менеджерах состояния.

В общем, не просто так они так сделали. Не идиоты сидят. Хотя, конечно, когда впервые с этим сталкиваешься, волнение ебать — где мои любимые классы, мать вашу? А потом привыкаешь и понимаешь — а ведь удобно, суки!