Ответ
Использование value-типов (struct) для View в SwiftUI — это фундаментальный дизайнерский выбор, обеспечивающий производительность, безопасность и простоту.
Ключевые причины:
- Производительность и value-семантика: Структуры дешевле создавать и уничтожать. SwiftUI часто перестраивает дерево представлений в ответ на изменение данных. Легковесные
structпозволяют делать это без накладных расходов на управление памятью (как у классов). - Безопасность состояний: Поскольку структуры копируются при изменении, исключаются неявные разделяемые мутабельные состояния между частями UI, что является частой причиной багов.
- Детерминированное сравнение: SwiftUI использует диффинг для эффективного обновления интерфейса. Value-типы с автоматической реализацией
Equatableдля своих свойств позволяют системе легко определить, изменилось ли представление и нужно ли его перерисовывать. - Потокобезопасность: Копирование значений безопасно в многопоточной среде, что упрощает работу фреймворка.
Пример:
// 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 — лёгкий и тупой, а мозги — отдельно, в менеджерах состояния.
В общем, не просто так они так сделали. Не идиоты сидят. Хотя, конечно, когда впервые с этим сталкиваешься, волнение ебать — где мои любимые классы, мать вашу? А потом привыкаешь и понимаешь — а ведь удобно, суки!