Весной 2025 года в Стэнфордском университете стартовал обновленный культовый курс CS193p, посвященный разработке под iOS. Бессменный преподаватель дисциплины Пол Хегарти, обучающий студентов созданию приложений практически со дня релиза первого iPhone, представил совершенно новый взгляд на проектирование интерфейсов с помощью SwiftUI и Xcode. В первой лекции профессор подробно разобрал, почему современная мобильная разработка полностью отказывается от классического объектно-ориентированного программирования в пользу функционального и реактивного подходов.
🎓 О курсе CS193p и новой парадигме разработки 0:05
Изучение мобильной разработки в Стэнфорде имеет долгую историю. Профессор Пол Хегарти ведет этот курс уже около 14–15 лет, то есть практически с момента появления самой платформы iOS. За эти годы подходы к программированию кардинально изменились. Главной особенностью актуального курса является фокус на кроссплатформенности в экосистеме Apple. Хотя основная работа будет вестись над приложениями для iPhone и iPad, создаваемый проект будет полноценно функционировать и на macOS. По мнению Хегарти, прелесть SwiftUI заключается в высокой портативности знаний: инструменты, освоенные для смартфона, без изменений подходят для разработки под Apple Watch, tvOS или visionOS.
Однако ключевой вызов для новичков кроется не в разнообразии устройств, а в фундаментальной смене парадигмы мышления. SwiftUI полностью ломает привычные представления об объектно-ориентированном программировании (ООП). Язык Swift хотя и напоминает внешне синтаксис C-подобных языков, представляет собой совершенно иную технологию.
Вместо ООП студентам предстоит освоить:
- Функциональное программирование, с которым, как отмечает лектор, на практике знаком лишь редкий процент учащихся.
- Протокол-ориентированное программирование (Protocol-Oriented Programming).
- Реактивные пользовательские интерфейсы.
Единственной популярной альтернативой SwiftUI с реактивной архитектурой Хегарти называет фреймворк React (и React Native). Тем, кто уже сталкивался с React, будет гораздо проще адаптироваться к логике SwiftUI. Даже работа с базами данных (SQL) в курсе будет вестись на более высоком уровне абстракции, который напоминает объекты, но технически реализуется совершенно иначе, без привлечения механизмов ООП.
🛠️ Требования к студентам: сколько кода придется писать 4:24
Главное требование курса — готовность писать колоссальные объемы кода. Профессор Хегарти подчеркивает, что это не связано со спецификой Swift или SwiftUI, которые сами по себе весьма лаконичны. Это его личная педагогическая философия: невозможно освоить систему разработки по теоретическим тестам, только через реальную практику. Если студент способен написать работающий код, значит, он понял концепцию.
Для комфортного прохождения курса Хегарти рекомендует иметь за плечами базу в виде стэнфордских курсов CS106A/B, CS107 (системное программирование), а также опыт работы со структурами данных и другими языками. Лектор сформулировал понятие «бонусного требования»: курс пройдет успешно, если студент уже знает хотя бы два разных языка программирования (например, Python, Java и C++).
Если же в арсенале учащегося есть только Python, изучение Swift станет серьезным дополнительным бременем, так как придется одновременно учиться учить новые языки. Сам Хегарти иронично замечает, что в его возрасте, когда за плечами десятки освоенных языков, изучение еще одного вызывает лишь мысль «ну ладно, здесь нет ничего нового под луной». Swift — это сложный, современный язык, вобравший в себя лучшие практики индустрии, и его освоение требует времени.
📖 Механика обучения: «роман» длиною в семестр 7:00
Вся коммуникация на курсе выстроена вокруг платформ Canvas и Ed Discussion. Профессор призывает студентов не стесняться прерывать его вопросами прямо в аудитории, но признает, что во время домашних заданий главным спасением становится Ed Discussion, где ответы на технические вопросы публикуются практически мгновенно. Лекционный процесс Хегарти называет «нарративным» и строит его на правиле трех повторений:
- Первое знакомство с концепцией происходит на слайдах или в виде устного объяснения.
- Второе повторение — в режиме живого демо, когда профессор сам пишет код на лекции.
- Третье закрепление — самостоятельное выполнение домашней работы.
Профессор противопоставляет два подхода к обучению программированию:
- Нарративный подход (Narrative approach) — когда на протяжении 6–7 недель пишется одно гигантское приложение. Это похоже на совместное написание романа, где постепенно раскрываются новые персонажи, сюжетные арки и сеттинг.
- Виньеточный подход (Vignette approach) — метод точечного поиска в Google или ChatGPT (например, по запросу «как сделать ScrollView в SwiftUI»). Нейросеть или сайт выдает готовые 12–15 строк изолированного кода.
По мнению Хегарти, идеальное обучение сочетает оба метода. Сначала закладывается мощный фундамент через сквозной нарратив лекций и первых пяти домашних заданий, которые строго базируются друг на друге (опоздание с первой домашкой неизбежно вызовет каскад задержек по остальным). А затем, в последние три недели семестра, во время работы над финальным проектом, студенты уходят в «виньеточное» плавание, самостоятельно ища нестандартные решения в сети. Финальный проект можно делать в одиночку или вдвоем, но Хегарти предупреждает: требования к командным проектам из двух человек гораздо выше, и работы там будет в разы больше, чем если бы каждый делал свой проект индивидуально.
🧭 Тур по Xcode: «спираль» интерфейса 12:54
Знакомство со средой разработки Xcode Пол Хегарти провел в виде «спирали» — начав с верхнего левого угла и постепенно продвигаясь по краям к центру экрана. При создании проекта выбирается шаблон Multiplatform App (для поддержки iPhone, iPad и Mac). Профессор обратил особое внимание на критически важный шаг: проект необходимо сохранять строго в ту директорию, которая была клонирована из репозитория GitHub в рамках «нулевого» домашнего задания. Если все сделано правильно, чекбокс «Create Git repository on my Mac» внизу окна будет серым и недоступным для нажатия, поскольку среда распознает уже существующий Git-репозиторий.
Пройдемся по ключевым элементам Xcode в рамках предложенной спирали:
- Левая панель (Навигатор / Navigator): Скрывается и открывается крайней левой кнопкой. Имеет множество вкладок. Первая — структура файлов (Swift-файлы с оранжевой птичкой, папка Assets для медиафайлов, иконок и цветов). Верхний элемент — сам проект с сотнями настроек (включая выбор целевой ОС — в данном случае iOS 18.2). Другие вкладки навигатора отвечают за поиск по проекту, точки останова (breakpoints) и историю сборки (позволяет посмотреть логи прошлых запусков, если приложение упало).
- Кнопка запуска (Play) и симуляторы: Запускает компиляцию приложения. Хегарти выбрал в качестве целевого устройства симулятор iPhone 16. Встроенный iOS-симулятор представляет собой полноценную виртуальную копию телефона, где работают системные настройки, календарь и почта, что необходимо для тестирования интеграций вашего приложения. При желании можно подключить реальный iPhone по USB или даже по Wi-Fi (если компьютер и телефон в одной сети).
- Xcode Cloud: Облачная система тестирования. Позволяет автоматически проверять работоспособность приложения на сотнях комбинаций устройств и версий iOS перед отправкой в App Store. В рамках курса использоваться не будет.
- Библиотека (Кнопка «+»): Скрытое сокровище Xcode. Содержит вкладку View-модификаторов (их сотни, и их освоение — ключ к SwiftUI), шаблоны кода (snippets), цвета, изображения и коллекцию системных иконок. Для удобного поиска иконок Хегарти рекомендует скачать отдельное официальное приложение SF Symbols с сайта Apple.
- Инспектор (Правая панель): Отображает свойства выделенного элемента. Позволяет менять UI без написания кода вручную (например, изменение шрифта на Large Title автоматически дописывает соответствующую строчку в код). По словам Хегарти, это полезно для дизайнеров или специалистов по локализации, но программисты на курсе будут писать все руками, поэтому панель инспектора обычно закрывают для экономии места.
- Нижняя панель (Консоль и Отладчик): В реактивном интерфейсе логирование в консоль — самый удобный способ отладки без прерывания процесса отрисовки. Слева отображается состояние переменных при падении приложения (backtrace).
- Верхняя навигационная строка: Показывает хлебные крошки (путь к текущему элементу в коде, например: проект -> папка -> файл -> структура -> свойство
body). Также содержит вкладки и кнопки «вперед-назад» как в браузере. Double-arrow кнопка открывает встроенный инструмент код-ревью, подсвечивающий изменения относительно последнего коммита Git.
🧩 Разбор кода и «Лего-аналогия» Пола Хегарти 37:14
Основой любого файла SwiftUI является описание интерфейса и директива #Preview, которая отвечает за работу холста предварительного просмотра (Preview Canvas). Этот холст компилирует и отображает изменения в коде мгновенно и в реальном времени. Стоит изменить строку на «Hello CS193p!», как текст на экране симулятора справа тут же обновляется.
Разбирая базовый шаблон кода, Хегарти объяснил значение каждого ключевого слова:
import SwiftUI— подключение внешнего модуля, содержащего все стандартные элементы интерфейса Apple. Для логики игры будут использоваться другие модули (например,FoundationилиSwiftDataдля баз данных).struct— структура. Главный строительный механизм в Swift. В отличие от других языков, структуры в Swift имеют функции, что делает их похожими на классы. Однако у структур нет наследования, они намного «легче» классов и лежат в основе всего UI фреймворка.ContentView: View— двоеточие означает не наследование классов, а то, что структура соответствует протоколу (ведет себя как)View. Протокол в Swift — это просто описание поведения: список функций без тел и переменных без значений.
По мнению Хегарти, протоколы — это обоюдоострый меч. С одной стороны, вы обязаны выполнить требования протокола. Для View это требование ровно одно — реализовать вычисляемую переменную var body: some View. С другой стороны, взамен вы бесплатно получаете сотни готовых функций (модификаторов) для этой структуры.
Язык Swift является строго типизированным. Любая переменная обязана иметь конкретный тип, и она должна иметь значение в любой момент времени (в Swift нет концепции null или nil в их привычном понимании — для этого существует специальный тип Optional). Переменная var body является вычисляемым свойством (computed property). Код внутри нее запускается каждый раз, когда система запрашивает значение переменной. Конструкция some View — это магия компилятора. Она означает, что внутри должен возвращаться один конкретный тип, удовлетворяющий протоколу View, и компилятор сам определит его на основе написанного кода.
Для объяснения того, как устроены View, Пол Хегарти предложил использовать метафору конструктора Lego, разделив элементы интерфейса на четыре типа:
- Базовые кирпичики Lego (Lego bricks): Это атомарные элементы интерфейса, прямоугольные области на экране, которые умеют рисовать себя и принимать тач-события. Примеры:
Text,Image,Circle. - Собранная модель (например, Helicopter Lego): Крупный объект, собранный из других деталек. Это наши кастомные представления интерфейса, такие как сама структура
ContentView. - Пакет с детальками (Bag of Lego): Набор элементов, лежащий внутри фигурных скобок. В SwiftUI это технически называется
TupleView— контейнер, который просто удерживает несколько View вместе. - Страница инструкции по сборке (Instruction manual page): Элементы, чья единственная цель в жизни — определять, как именно другие кирпичики будут располагаться друг относительно друга. Пример — контейнер
VStack, который выстраивает элементы по вертикали.
📐 Секреты синтаксиса: заглядываем внутрь VStack 58:12
Конструкция VStack на первый взгляд выглядит странно: у нее нет круглых скобок для аргументов, но сразу идут фигурные. Профессор Хегарти открыл официальную документацию Swift, чтобы показать реальное устройство инициализатора VStack. Выяснилось, что конструктор принимает три параметра: alignment (выравнивание), spacing (расстояние между элементами) и content (само содержимое).
Если расписать инициализатор полностью, код принимает следующий вид:
VStack(alignment: .center, spacing: 10, content: { ... })
Хегарти разобрал параметры подробнее. Вместо привычных «left» и «right» для выравнивания используются термины leading (ведущая сторона) и trailing (ведомая). Лектор объяснил это необходимостью автоматической адаптации интерфейса под языки, где текст читается справа налево (например, арабский или иврит). Параметр spacing по умолчанию подставляет идеальное расстояние, специфичное для конкретной платформы (будь то крошечный экран Apple Watch или холст visionOS).
Третий аргумент content имеет тип () -> Content, где Content должен соответствовать протоколу View. Это чистая демонстрация функционального программирования: мы передаем функцию (замыкание), не принимающую аргументов и возвращающую View, внутрь другого объекта.
Чтобы собрать несколько элементов внутри одной функции без явного написания оператора return после каждой строчки, используется специальный атрибут @ViewBuilder. Если пометить им функцию, компилятор автоматически упакует все лежащие внутри элементы (например, Image, Text и Circle) в один общий TupleView. А благодаря ключевым словам some View, разработчику не нужно вручную прописывать громоздкие типы вроде TupleView<Image, Text, Circle> — компилятор берет эту работу на себя.
Тот лаконичный вид VStack, который генерируется в шаблоне по умолчанию, получается благодаря двум правилам синтаксического сахара в Swift:
- Синтаксис последующего замыкания (Trailing Closure Syntax): Если последним аргументом функции или инициализатора является другая функция, ее имя (label) можно опустить, а сами фигурные скобки вынести за пределы круглых скобок.
- Опущение пустых скобок: Если у инициализатора нет других аргументов (или нас устраивают их дефолтные значения), круглые скобки перед фигурными можно стереть полностью. Обычный кирпичик Lego вроде
Circle()так сократить нельзя, потому что у него на конце нет «висящей» функции-замыкания.
Помимо вертикального контейнера VStack, существуют также HStack (для горизонтального размещения элементов) и ZStack (для послойного наложения элементов друг на друга по оси Z). На следующей лекции Пол Хегарти пообещал подробно разобрать работу с цветами, пропорциями и View-модификаторами, после чего начнется активная разработка сквозного курсового приложения CodeBreaker.