Stanford CS193p: Глубокое погружение в систему типов Swift и архитектуру Model-UI

Stanford Online 13,2 тыс. 1 ч 8 мин 5 мин 14.11.2025
Главное

В третьей лекции обновленного курса Stanford CS193p (весна 2025 года) профессор Пол Хэгарти переходит от основ верстки к фундаментальным концепциям, которые делают SwiftUI мощным инструментом: архитектурному разделению данных и интерфейса, а также строгой системе типов Swift.

🛠 Завершение демо: Магия замыканий и синтаксический сахар 0:05

Лекция началась с разбора функции matchMarker(), которая использовалась в приложении CodeBreaker . Хэгарти продемонстрировал три способа возврата View в Swift, подчеркивая гибкость языка:

По мнению Хэгарти, выбор между этими подходами — это вопрос «искусства программирования». Хотя некоторые разработчики критикуют использование @ViewBuilder вне основного тела View, профессор считает это допустимым для декомпозиции сложных интерфейсов на более мелкие «вертолетные представления» (helicopter views) .

Особое внимание было уделено упрощению замыканий (closures). Процесс трансформации громоздкой функции в элегантную строку кода включает:

  1. Вывод типов (Type Inference): Swift понимает, что функция возвращает Bool, поэтому тип можно не указывать .
  2. Замыкания in-line: Перенос логики непосредственно в аргумент функции (например, в .count { ... }).
  3. Краткие имена аргументов: Использование $0 вместо именованных параметров .
  4. Синтаксис замыкания, идущего последним (Trailing Closure Syntax): Вынос фигурных скобок за пределы круглых скобок вызова функции .

🏛 Архитектура: Модель против Интерфейса 17:00

Центральная тема лекции — разделение Model и UI. По словам Хэгарти, данные в приложении текут из Модели через UI к чувствам пользователя (зрению и слуху) .

Ключевые принципы Модели:

Для управления состоянием используются специальные обертки, такие как @State (для простых локальных данных) и @Observable (для более сложных объектов, этот инструмент будет подробно разобран позже) .

🏗 Система типов: Струтуры против Классов 23:50

Swift опирается на две основные сущности: struct (структуры) и class (классы). Хэгарти подчеркивает, что понимание разницы между ними критически важно для разработки на iOS.

Структуры (Value Types):

Классы (Reference Types):

Несмотря на риски, классы незаменимы, когда требуется совместное использование данных (sharing) или когда объекту нужна четкая «идентичность» (identity) через указатель . Однако в SwiftUI почти все View — это структуры.

🌈 Мощь Enum и ассоциированные данные 41:24

Перечисления (Enums) в Swift — это гораздо больше, чем просто список констант. Профессор называет их, возможно, самой часто используемой структурой данных в языке после Optionals .

Главная особенность — ассоциированные данные (associated data). Каждый кейс перечисления может нести в себе уникальную информацию. Например, в меню фастфуда кейс .hamburger может содержать количество котлет (Int), а .drink — название напитка (String) и объем (Float) .

Для извлечения этих данных используется оператор switch. Хэгарти напоминает, что switch в Swift должен быть исчерпывающим: необходимо обработать либо все возможные кейсы, либо использовать default . В отличие от языков вроде C или Java, в Swift выполнение кейса не «проваливается» в следующий автоматически (нет implicit fallthrough) .

🧩 Генерики: Типы «мне всё равно» 50:18

Swift — строго типизированный язык, но иногда разработчику «все равно», с каким конкретно типом работать. Для этого используются генерики (Generics).

Классический пример — Array. Массиву не важно, хранит он числа, строки или кастомные структуры. В коде это описывается через «заполнитель типа» в угловых скобках: Array<Element> . Когда мы создаем массив Array<Int>, заполнитель Element становится конкретным типом Int . Хэгарти отмечает, что вся система SwiftUI построена на генериках, хотя новички часто этого не замечают.

❓ Optionals: Основа безопасности Swift 54:05

Optional (опционал) — это решение проблемы отсутствия значения. В Swift переменная не может быть «пустой» или null, если она не объявлена как опциональная.

Технически Optional — это генерическое перечисление с двумя кейсами :

  1. .none (синтаксический сахар — nil): значение отсутствует.
  2. .some(T): значение типа T присутствует.

Для работы с опционалами Swift предлагает множество инструментов:

🔌 Расширения (Extensions) 1:05:42

Расширения позволяют добавлять новую функциональность (методы и вычисляемые свойства) в уже существующие типы, даже если у вас нет их исходного кода (например, в стандартные типы Apple вроде Color или Array) .

Хэгарти подчеркивает важность расширений для протоколов. Например, сотни модификаторов View в SwiftUI добавлены именно через расширения к протоколу View . В домашнем задании студентам предстоит использовать расширения для конвертации строковых названий цветов в объекты Color .

Лекция завершилась анонсом следующего занятия: на нем не будет слайдов, только написание кода для Модели игры CodeBreaker .

💬 Цитаты

«SwiftUI — это декларативный и реактивный интерфейс. Мы декларируем Views, а система реагирует на изменения.»

Пол Хэгарти 20:18

«Классы имеют сильное чувство идентичности из-за указателей, но это делает их опасными при передаче в функции.»

Пол Хэгарти 38:45

«Underbar (_) в Swift везде означает «ничего», «игнорировать это».»

Пол Хэгарти 26:40
👥 Спикер
🔗 Упомянутые сайты и проекты
📖 Термины
Trailing Closure Syntax
Синтаксис в Swift, позволяющий выносить замыкание за скобки вызова функции, если оно является последним аргументом.
Copy-on-write
Механизм оптимизации, при котором реальное копирование данных в памяти происходит только тогда, когда копия пытается изменить эти данные.
Generics
Инструмент языка, позволяющий писать функции и типы, которые работают с любыми типами данных, используя заполнители (placeholder types).
Optionals
Специальный тип в Swift, который может либо содержать значение определенного типа, либо не содержать ничего (nil).
📊 Цифры
🗓 Хронология
  1. 2025 Запуск обновленного курса CS193p в Стэнфордском университете.
  2. Март 2025 Чтение лекции о системе типов и архитектуре Model-UI.
⚖️ Другая сторона
Образование SwiftUI Swift Stanford University iOS development