iOS SwiftUI 2025

Стэнфордский курс CS193p — «Developing  Application for iOS with SwiftUI» («Разработка приложений для iOS с помощью SwiftUI») объясняет как создавать приложения для iPhone и iPad, используя SwiftUI.

Пол Хегарти — преподаватель, ведущий курс CS193p в Стэнфорде с 2010 года.

Ниже вы найдете ссылки на видео и вспомогательные материалы курса CS193p (Разработка приложений для iOS с использованием SwiftUI) Стэнфордского университета (весна 2025 года). Этот курс предназначен для студентов Стэнфорда и знакомит с основами разработки iOS-приложений.

Курс проходил до выхода iOS 26 и Xcode 26, но код, написанный во время курса, в основном совместим с ними. Главное изменение в Xcode 26, конечно же, — это встроенная поддержка LLM, а в iOS 26 появилась функция Liquid Glass в пользовательском интерфейсе, поэтому, разумеется, в этих видео её нет.

К сожалению, мы не можем оказывать вам поддержку во время просмотра этих видео, но в интернете есть множество замечательных ресурсов, которые помогут вам в вашем стремлении научиться разрабатывать iOS-приложения, поэтому обязательно воспользуйтесь ими!

P.S. В русскоязычных иллюстрированных конспектах Лекций сделаны пометки на полях, касающиеся некоторых изменений в Xcode 26 и iOS 26.

Код, сопровождающий Лекции, находится на GitHub.

Лекция 1. Начало работы со SwiftUI.

Введение в курс. Основы SwiftUI и Xcode, особенно Views.

Пол Хегарти дает обзор курса, описывает необходимые предварительные условия (умение писать большой объем кода, опыт структурированного программирования) и объясняет структуру курса, которая использует «нарративный подход», где студенты создают одно большое приложение (CodeBreaker) в течение 6-7 недель, а не изучают материал по небольшим фрагментам кода.

Он проводит всесторонний обзор интерфейса Xcode и знакомит с основами SwiftUI View, используя аналогию с конструктором Lego, сравнивая базовые Views (Text, Image, Circle) с кубиками Lego, составные Views (ContentView) с собранными законченными фрагментами Lego, View-контейнеры (VStack) с инструкциями по сбору фрагментов Lego, а коллекции Views — с «мешками Lego» .

Лекция также охватывает основы синтаксиса Swift, включая структуры struct, переменные var и концепцию some View как вычисляемого свойства.

Смотреть в YouTube.
Русскоязычный иллюстрированный конспект Лекции 1.
Задание на чтение 1.
Код на GitHub.

Лекция 2. Больше о SwiftUI. Создание приложения Code Breaker.

Продолжается объяснение разработки на SwiftUI с введением модификаторов View, второго основного столпа построения UI, наряду с View. Демонстрируется, как модификаторов View работают в виде цепочек функций, возвращающих измененные View, с такими примерами, как .font(), .foregroundStyle() и .padding(). Объясняется, как модификаторы View применяются по порядку и могут передаваться от контейнерных View к их дочерним элементам.

Затем лекция переходит к созданию приложения Code Breaker, созданию и размещению фишек pegs в игре, а затем к созданию маркеров с использованием Shapes с такими модификаторами, как .fill(), .stroke() и .opacity(). Рассматривается создание пользовательских структур, которые ведут себя как View, перемещение View в отдельные файлы, использование перечислений enum (для состояний совпадения, таких как .exact, .inexact, .nomatch).

Вводятся концепции функционального программирования, такие как count(where:) для обработки массивов. В лекции подчеркивается важность декомпозиции как решающего фактора для удобства сопровождения кода и производительности компилятора.

Смотреть в YouTube.
Русскоязычный иллюстрированный конспект Лекции 2.
Задание на программирование 1.
Код на GitHub.

Лекция 3. Модель и UI; система ТИПов в Swift.

Введение в курс. Основы SwiftUI и Xcode, особенно Views.

Пол Хегарти дает обзор курса, описывает необходимые предварительные условия (умение писать большой объем кода, опыт структурированного программирования) и объясняет структуру курса, которая использует «нарративный подход», где студенты создают одно большое приложение (CodeBreaker) в течение 6-7 недель, а не изучают материал по небольшим фрагментам кода.

Он проводит всесторонний обзор интерфейса Xcode и знакомит с основами SwiftUI View, используя аналогию с конструктором Lego, сравнивая базовые Views (Text, Image, Circle) с кубиками Lego, составные Views (ContentView) с собранными законченными фрагментами Lego, View-контейнеры (VStack) с инструкциями по сбору фрагментов Lego, а коллекции Views — с «мешками Lego» .

Лекция также охватывает основы синтаксиса Swift, включая структуры struct, переменные var и концепцию some View как вычисляемого свойства.

Смотреть в YouTube.
Русскоязычный иллюстрированный конспект Лекции 3.
Задание на чтение 2.
Код на GitHub.

Лекция 4. Построение Модели CodeBreaker.

Создание модель CodeBreaker и подключение к ней UI. Попутно используются @State, Optional и onTapGesture. CodeBreaker теперь доступен для игры!

Эта лекция посвящена реализации разделения Модели и UI в CodeBreaker.

Создается Модель игры CodeBreaker, включающая CodeBreaker (основная игровая логика), Code (с перечислением enum Kind для типов Code master/guess/attempt ) и Peg (реализованный просто как псевдоним ТИПа для Color).

Затем создается CodeBreakerView, который становится визуальным воплощением Модели. Ключевые концепции включают: правильную организацию файлов, использование @State для изменяемого состояния UI, пометку функций как mutating в структурах struct, которые могут быть изменяемыми, развертывание Optional с помощью if-let , операторы nil объединения и multi-touch ввод с помощью onTapGesture().
Демонстрируется, как SwiftUI автоматически обновляет UI при изменении Модели, реализуется Tap-цикл выбора Peg. Обсуждается важность разделения логики Модели от презентации UI.
К концу лекции CodeBreaker становится полностью работающей игрой.

Смотреть в YouTube.
Русскоязычный иллюстрированный конспект Лекции 4.
Задание на программирование 2.
Код на GitHub.

Лекция 5. Layout (Маке); Поток Данных (Data Flow).

Как SwiftUI размещает элементы UI на экране — Layout.
Также обсуждается, как данные передаются между Views в SwiftUI
приложении.
Введение в функциональное программирование.

Контейнерные Views, такие как HStack / VStack, сначала предоставляют пространство для наименее гибких Views (текст Text, изображение Image), а затем для более гибких (круг Circle, прямоугольник Rectangle).
Ключевые концепции Layout включают

  • Spacer для гибкого отступа,
  • layoutPriority() для переопределения порядка по умолчанию и
  • «ленивые» контейнеры (LazyVStack, LazyHGrid) для повышения производительности при работе с большими наборами данных.
  • Представлены продвинутые контейнеры, такие как Form, List, Grid и ViewThatFits.

Объясняются View модификаторы ZStack: overlay / background, отладка с цветным фоном и то, как такие View модификаторы, как .padding, участвуют в Layout.

Демонстрируется применение функционального программирования с использованием функции map() для преобразования массивов, показан захват замыканием локальных переменных и рефакторизация функции matchAgainst() с использованием методов функционального программирования вместо циклов for, подчеркивая мощь и элегантность функциональных подходов в Swift.

Смотреть в YouTube.
Русскоязычный иллюстрированный конспект Лекции 5.
Код на GitHub.

Лекция 6. Демонстрация Data Flow.

Эта лекция полностью посвящена демонстрациям и охватывает продвинутые Data Flow паттерны в SwiftUI.

Реализован интерфейс «клавиатуры» для выбора peg, улучшающий ввод данных пользователем по сравнению с методом «циклического Tap».

Ключевые темы включают:

  • организацию файлов с рефакторингом «извлечение в файл» (Extract to File),
  • создание PegView как многоразового компонента,
  • использование комментариев // MARK для организации кода,
  • реализацию @State для отслеживания выбора selection
  • создание кнопок Button с пользовательскими Views в качестве меток.

Демонстрируется поток данных Data Flow от ввода пользователя через взаимодействие с Views до обновления Модели, показывая, как Views становятся визуальными проявлениями состояния Модели.

Представлен цикл ForEach без индексов indices, когда данные уникальны, расширение extension для добавления пользовательской функции Color.gray() с параметром яркости brightness, а также разница между CGFloat (для рисования) и Double (для общих математических вычислений).

В данной реализации демонстрируются такие практические паттерны SwiftUI, как синтаксис «хвостовых» замыканий с несколькими замыканиями, операторы guard для защитного программирования и правильное @State управление состоянием UI, которое не должно находиться в Модели.

Смотреть в YouTube.
Русскоязычный иллюстрированный конспект Лекции 6.
Задание на программирование 3.
CodeBreaker ↳
Код на GitHub.

Лекция 7. Generic и Views; Анимация.

Generics и пользовательские View модификаторы.
Рефакторинг CodeView для приема любых вспомогательных View (например, MatchMarkers или кнопки «Guess») с использованием Generics с ограничениями (AncillaryView: View).

Демонстрация передачи параметра @Binding в init View, реализация поддержки @ViewBuilder для гибкого содержимого и использование @escaping для замыканий, которые существуют дольше вызывающей их функции.

Другие темы включают fileprivate структуры structs, синтаксис «хвостовых» замыканий с несколькими замыканиями, ограничения Generic ТИПов с условиями where и то, как встроенные в SwiftUI View, такие как VStack, реализуют аналогичные шаблоны..

Представлена Анимация теоретически на слайдах.

Смотреть в YouTube.
Русскоязычный иллюстрированный конспект Лекции 7.
Задание на чтение 3.
CodeBreaker ↳
Код на GitHub.

Лекция 8. Демонстрация Анимации.

Демонстрируется явная (explicit) анимация с помощью withAnimation(), создание пользовательских констант анимации с использованием расширения extension структуры Animation и отладка проблем с анимацией путем замедления времени.

Для демонстрации анимации в CodeBreaker добавлена ​​кнопка перезапуска «Restart».

Рассматриваются .animation (nil) и .transaction() для выборочного подавления анимации, предотвращение анимации, которая может раскрыть скрытое состояние игры, и реализация переходов transitions между Views, таких как .move() и .offset(), для имитации поведения, напоминающего скольжению клавиатуры.

Обсуждаются транзакции transactions анимации, разница между подавлением анимации на основе изменений состояния против подавлением анимации на основе условий, а также создание плавного взаимодействия с пользователем.
Демонстрируются практические методы отладки сложных проблем с синхронизацией анимации..

Смотреть в YouTube.
Русскоязычный иллюстрированный конспект Лекции 8.
CodeBreaker ↳
Код на GitHub.

Лекция 9. Elapsed Time; Протоколы Protocols.

Больше анимации.
Реализовано отслеживание затраченного времени для демонстрации анимации и других возможностей Swift. Включает реализацию пользовательского ElapsedTimeView с текстовыми форматтерами, в частности, форматтером .offset для отображения разницы во времени.

Обсуждение протоколов protocol, важного аспекта системы типов Swift.

Смотреть в YouTube.
Русскоязычный иллюстрированный конспект Лекции 9.
CodeBreaker ↳
Код на GitHub.

Лекция 10. List и Navigation.

Приложение Code Breaker улучшено для отображения нескольких игр. Улучшена архитектура приложения для отображения нескольких Views.
Реализовано View GameChooser с List, продемонстрировано управление @State на корневом уровне приложения и реализованы именованные игры CodeBreaker с различными темами (Mastermind, Earth Tones, Undersea).

Показано, как List объединяет ScrollView, ForEach и разделители в мощное контейнерное View для создания приложений.
Попутно рефакторизован ForEach с прямой итерацией по коллекциям вместо индексов, что обеспечивает уникальные идентификаторы для стабильных анимаций, удовлетворяя трем требованиям к идентификаторам ForEach (уникальность, стабильность, хешируемость).
Также включено соответствие Hashable для пользовательских ТИПов (перечисления enum Code и enum Match), синтезированное в отличие от ручного соответствия протоколам, а также реализация протокола Identifiable с пользовательской логикой идентичности.

Смотреть в YouTube.
Русскоязычный иллюстрированный конспект Лекции 10.
Задание по программированию 4.
CodeBreaker ↳
Код на GitHub.

Лекция 11. iPad; Sheets.

Заставляет приложение Code Breaker работать на разных платформах (iPhone, iPad, Mac) с помощью NavigationSplitView.
Демонстрируется преобразование NavigationStack в NavigationSplitView для отображения нескольких Views рядом друг с другом на больших экранах.
Попутно рассматривается понимание Size Classes (.compact и .regular), определяющих поведение разделенного экрана, управление видимостью столбцов и добавление заголовков навигации с помощью navigationTitle().
Управление состоянием selection в списках List с помощью @Binding. Использование @Bindable для @Observable свойств.
Особое внимание уделяется созданию адаптивных UI вместо использования фиксированных размеров frame.
Введение в Sheet для модальных интерфейсов редактирования.

Смотреть в YouTube.
Русскоязычный иллюстрированный конспект Лекции 11.
Задание на чтение 4.
CodeBreaker ↳
Код на GitHub.

Лекция 12. Редактор CodeBreaker.

Создание модальных интерфейсов и многократно используемых View компонентов.
Создается PegChoicesChooserView для редактирования количества и цветов игровых фишек pegs.
Демонстрируется управление отображением sheet с помощью привязок Binding к isPresented и создание редакторов игр с привязкой данных с использованием @Bindable для @Observable объектов.
Создается гибкий UI, который может обрабатывать как создание новых игр, так и редактирование существующих. Ключевые концепции включают использование Optional для условных данных, реализацию пользовательских @ViewBuilder функций и обработку закрытия dismiss sheet.
Особое внимание уделяется созданию многократно используемых UI компонентов и правильным шаблонам потока данных в модальных Views.

Смотреть в YouTube.
Русскоязычный иллюстрированный конспект Лекции 12.
CodeBreaker ↳
Код на GitHub.

Лекция 13. SwiftData.

Использование SwiftData для обеспечения постоянного хранения данных в приложении.
Показано, как преобразовать Модель из структур struct в @Model классы class. Объясняются ограничения на ТИПы @Model переменных vars (примитивы, другие @Model , Codable, массивы Arrays), использование аннотаций @Relationship для связей между таблицами и использование @Transient для непостоянно хранимых данных.
Ключевые понятия включают настройку ModelContainer в приложении и #Preview, использование @Environment(\.modelContext) для доступа к базе данных и создание FetchDescriptors с #Predicates и сортировку.
Рассматривается обработка ошибок с помощью try/catch, вычисляемые свойства для преобразования ТИПов между Моделью и UI Views, а также ограничения запросов к базе данных (запрет на вычисляемые переменные в предикатах).

Смотреть в YouTube.
Русскоязычный иллюстрированный конспект Лекции 13.
CodeBreaker ↳
Код на GitHub.

Лекция 14. Больше SwiftData.

Лекция 14 курса CS193p 2025 посвящена углублённой работе со SwiftData в приложении CodeBreaker. Основная тема — как сделать данные приложения постоянно сохраняемыми между запусками и как эффективно искать объекты в базе.
Кратко по содержанию:

  • Использование @Model для хранения игровых данных в базе.
  • Настройка ModelContainer и ModelContext.
  • Сохранение и автоматическая загрузка игр при перезапуске приложения.
  • Работа с @Query и #Predicate для фильтрации данных.
  • Построение поисковых запросов по сохранённым играм.
  • Организация SwiftUI Views, которые напрямую работают с SwiftData.
  • Создание корректных #Preview для Views, использующих базу данных.
  • Практические паттерны архитектуры SwiftUI + SwiftData .

Главная идея лекции:

SwiftData позволяет интегрировать постоянное хранение почти «нативно» в SwiftUI — данные автоматически синхронизируются с UI через реактивный Data Flow.

Ключевые технологии и концепции:

  • @Model
  • @Query
  • #Predicate
  • ModelContext
  • ModelContainer
  • постоянное хранение
  • SwiftUI previews с in-memory database

Практический результат после лекции: приложение уже не теряет состояние после закрытия, умеет хранить список игр и выполнять поиск/фильтрацию по ним.

Смотреть в YouTube.
Русскоязычный иллюстрированный конспект Лекции 14.
Задание на программирование 5.
CodeBreaker ↳
Код на GitHub.

Лекция 15. Еще больше SwiftData; Многопоточность.

Сначала мы завершаем изучение некоторых тем, связанных со SwiftData, в том числе сложных вариантов сортировки завершенных игр и сложных предикатных запросов, в которых задействовано несколько связей @Relationship в базе данных.

Теоретическая часть Лекции 15 посвящена многопоточности (concurrency) в Swift — прежде всего async/await, Task, actor isolation и работе UI в многопоточном окружении.

Основные темы лекции:

  • Введение в Swift Concurrency.
  • Использование async и await.
  • Создание и управление Task.
  • Почему UI должен обновляться только на MainActor.
  • Actor isolation и защита данных от race conditions.
  • Разница между: Task { } Task.detached { }
  • Асинхронная загрузка данных из сети.
  • Отмена задач (task cancellation).
  • Как SwiftUI автоматически интегрируется с concurrency.

Ключевые идеи:

  • await означает потенциальную точку приостановки.
  • Actors заменяют многие ручные механизмы синхронизации.
  • SwiftUI тесно интегрирован с MainActor.
  • Task {} наследует actor context, а Task.detached {} — нет.

Обсуждается, почему некоторые обращения к свойствам в Swift 6 больше не требуют await: компилятор научился устранять лишние actor hops.

Смотреть в YouTube.
Русскоязычный иллюстрированный конспект Лекции 15.
CodeBreaker ↳
Код на GitHub.

Продолжение следует ….