# Пол Хэгарти: «SwiftUI — это не объектно-ориентированное программирование»

Источник: https://www.youtube.com/watch?v=kCjDulwChRQ
Канал: Stanford Online
Опубликовано: 14.11.2025

---

Легендарный курс Стэнфордского университета CS193p возвращается в 2025 году с обновленной программой по SwiftUI. Профессор Пол Хэгарти, обучающий разработке под iOS уже полтора десятилетия, в первой лекции закладывает фундамент: от философских отличий Swift от объектно-ориентированных языков до детального разбора того, как работает «магия» декларативного интерфейса Apple.

## 🎓 Обзор курса и философия обучения
[[JUMP:0:05]]

Пол Хэгарти преподает этот курс практически с момента выхода первого iPhone [0:18]. Основной упор сделан на разработку под iPhone и iPad, однако благодаря универсальности SwiftUI, полученные знания применимы для создания приложений под macOS, Apple Watch, tvOS и даже visionOS [1:28].

Главное отличие курса в 2025 году — акцент на современных парадигмах. Хэгарти подчеркивает, что SwiftUI — это не объектно-ориентированное программирование (ООП), к которому привыкли многие разработчики [2:14]. Вместо него студенты будут изучать:

*   **Функциональное программирование:** подход, редко встречающийся в базовых курсах (кроме Haskell).
*   **Протокол-ориентированное программирование:** специфическая для Swift архитектура.
*   **Реактивные интерфейсы:** концепция, схожая с React и React Native, но реализованная нативными средствами Apple [3:13].

Курс построен по «нарративному» принципу: вместо разрозненных примеров (vignettes) студенты вместе с преподавателем в течение 6–7 недель строят одно массивное приложение — игру CodeBreaker [8:40]. Хэгарти считает, что только так можно понять, как компоненты взаимодействуют в реальном масштабе.

## 🛠 Инструментарий: Xcode и симуляторы
[[JUMP:13:06]]

Xcode — основная рабочая среда, которая требует детального изучения из-за своей сложности. Хэгарти провел «спиральный тур» по интерфейсу [15:28]:

1.  **Навигатор (слева):** управление файлами проекта, поиск, просмотр истории сборок и работа с активами (Assets) [15:54].
2.  **Панель управления (вверху):** выбор цели запуска. Приложения можно запускать на симуляторах различных моделей iPhone/iPad или напрямую на физическом устройстве через кабель или Wi-Fi [20:12].
3.  **Инспектор (справа):** позволяет настраивать свойства элементов UI (шрифты, цвета) визуально, при этом Xcode автоматически генерирует соответствующий код в редакторе [25:43].
4.  **Консоль и отладчик (снизу):** вывод сообщений системы и отслеживание состояния переменных при сбоях [27:35].

Особое внимание уделено **Preview Canvas** — инструменту «живого» просмотра. Код компилируется в реальном времени: любое изменение текста или цвета в редакторе мгновенно отображается на макете iPhone справа [33:58].

## 🧱 Анатомия SwiftUI: Теория «Лего»
[[JUMP:52:29]]

Для объяснения того, как устроены `View` в SwiftUI, Пол Хэгарти использует аналогию с конструктором Lego [52:44]. В этой системе всё является «кирпичиком» определенного типа:

*   **Базовые кирпичики (Bricks):** стандартные элементы, такие как `Text`, `Image` или `Circle` [53:53].
*   **Собранные модели (Helicopter):** ваши собственные компоненты, например `ContentView`, которые состоят из базовых кирпичиков [54:22].
*   **Мешок с деталями (Bag of Lego):** контейнер, который просто держит набор элементов вместе (в коде это `TupleView`) [56:17].
*   **Инструкция (Manual):** элементы, которые определяют правила расположения «кирпичиков». Например, `VStack` (вертикальный стек) или `HStack` (горизонтальный стек) [57:01].

## 💻 Погружение в синтаксис Swift
[[JUMP:39:40]]

Хэгарти подробно разобрал ключевые конструкции языка Swift, используемые в шаблоне нового проекта.

### Типы данных и переменные
Swift — строго типизированный язык [46:18]. Переменная всегда должна иметь четко определенный тип и значение. В Swift нет концепции «ничего» (null/nil) в привычном понимании других языков; вместо этого используется специальный тип **Optional** [47:03].

### Структуры (struct) против Классов (class)
В SwiftUI практически всё строится на структурах (`struct`). В отличие от классов, структуры в Swift не поддерживают наследование, но обладают огромной мощностью за счет функций и протоколов [41:42]. К изучению классов курс перейдет только через месяц.

### Вычисляемые свойства (Computed Properties)
Переменная `body` в `ContentView` является вычисляемой. Это означает, что её код выполняется заново каждый раз, когда системе нужно перерисовать интерфейс [48:44]. Хэгарти пояснил, что это работает крайне эффективно благодаря внутренним оптимизациям Swift [49:10].

## ✨ Магия ViewBuilder и синтаксический сахар
[[JUMP:1:04:34]]

Одной из самых сложных тем для новичков является ключевое слово `@ViewBuilder`. Оно позволяет писать древовидную структуру интерфейса без явного использования операторов `return`. 

*   **Неявный возврат:** Если внутри функции, помеченной `@ViewBuilder`, перечислить несколько `View`, компилятор автоматически упакует их в `TupleView` («мешок с деталями») [1:05:01].
*   **some View:** Разработчику не нужно указывать точный сложный тип этого «мешка» (например, `TupleView<Image, Text>`). Ключевое слово `some` приказывает компилятору самому вычислить конкретный тип, скрыв его сложность от программиста [1:05:55].
*   **Trailing Closure (замыкание в конце):** Если последний аргумент функции — другая функция, её можно вынести за скобки. Именно поэтому код выглядит не как `VStack(content: { ... })`, а как наглядное `VStack { ... }` [1:08:28].

В завершение лекции Пол продемонстрировал, как простым изменением `VStack` на `HStack` (горизонтальный) или `ZStack` (наложение слоев) можно полностью поменять логику отображения элементов без изменения самих «кирпичиков» контента [1:09:44].