Открытый вебинар «Онлайн-интенсив, день 1: Практическое применение SwiftUI» 12.11.2019 в 20:00 | OTUS >
Проходил 12 ноября 2019 года в 20:00

Открытый вебинар
Онлайн-интенсив, день 1: Практическое применение SwiftUI

Открытый вебинар онлайн

SwiftUI — новый framework, от Apple, предназначенный для декларативного описания UI в коде.

В прямом эфире мы разработаем полноценное приложение на SwiftUI. В процессе разработки изучим, как создавать современные интерфейсы на SwiftUI. И чем он лучше UIKit.
Преподаватель
Алексей Соболевский

Запись

О курсе

iOS Developer. Professional
100 000 ₽
Начало 29 апреля

Перейдите на новый уровень разработки

  1. Изучите актуальный стек технологий для современного iOS-разработчика: SwiftUI, Protocol Oriented Programming, Actor и async/await, CoreML, ARKit и RealityKit и др.
  2. Создадите свой аналог Pinterest, TikTok, Room Planner, VSCO, Strava или Canva в рамках разработки индивидуальной проектной работы, которая пополнит ваше портфолио
  3. Общение напрямую с преподавателями на лекциях и в Telegram-чате, обсуждение кейсов, задач, которые …
Программа курса
Модуль 1
SwiftUI и основы Combine
Модуль 2
Современная архитектура мобильных приложений
Модуль 3
Foundation без сторонних фреймвоков и Swift 6 Standard Library
Модуль 4
Многозадачность
Модуль 5
CoreML и Vision, нейронные сети и машинное обучение
Модуль 6
Networking и хранение данных
Модуль 7
Создание приложений для Apple Watch, TV, Mac
Модуль 8
Мультиплатформенная разработка: перенос на Android, Vulkan/Metal
Модуль 9
Организация разработки
Модуль 10
Проектная работа
SwiftUI и основы Combine
В этом модуле мы изучим внутренности UIKit, его архитектурные плюсы и недочеты. Научимся отображать комплексные данные. Оптимизировать рендеринг UI компонентов. Попрактикуемся в сборке интерфейсов корректно работающих на всех вариациях Size Classes и анимации.
Проектируем UI декларативно с SwiftUI. В чем отличия UIKit и SwiftUI
настроить окружение для работы на курсе и выполнения домашних заданий;
использовать Xcode;
создавать базовые интерфейсы на SwiftUI/Combine.
29 апреля, 20:00 — 21:30
Домашние задания: 1
ДЗ
Создание каркаса приложения на SwiftUI. Создать флоу экранов на SwiftUI
1. Добавить TabView.
2. На втором табе создать List, обернутый в NavigationView.
- Из списка должны быть переходы с использованием NavigationLink.
3. На третьем табе разместить кнопку, открывающую модальное окно.
4. На первом табе разместить кнопку, открывающую второй таб и один из пунктов в нем.
5. Протестировать приложение на симуляторах iPad/iPhone с проверкой смены ориентации устройства.

*6. Добавить один компонент UIKit через UIViewRepresentable.
SwiftUI List, List с кастомным лейаутом, Hosting ViewControllers
понимать, в каком состоянии приложение;
добавлять логику на изменение состояния приложения;
знать как устроен UIKit и его иерархия классов;
делать навигацию в SwiftUI разными способами.
6 мая, 20:00 — 21:30
Создание кастомных Shape, SwiftUI Drawing and Animation API
работать с CALayer и понимать систему координат, используемую в CoreGraphics;
программно рисовать Shapes в SwiftUI;
использовать анимацию в SwiftUI.
13 мая, 20:00 — 21:30
Использование NavigationView, TabView. Нативная навигация, бекпорты и фреймворки для поддержки всех функций
использовать NavigationView и TabView в SwiftUI;
использовать back ports и сторонних решений;
организация deeplinks и тестирования навигации.
15 мая, 20:00 — 21:30
Отображение структурированных данных, List, пейджинг, кастомные компоненты на UIViewRepresentable, принципы HIG
реализовывать пейджинг на SwiftUI;
кодогенерить Network слой в ДЗ;
привязывать List к реальному API с помощью кодогенерации.
20 мая, 20:00 — 21:30
Домашние задания: 1
ДЗ
Реализация пейджинга на реальном API. 1. Используйте открытое API: https://github.com/public-apis/public-apis
2. Добавить несколько рубрик по разным запросам (например, новости или города для отображения погоды). Переключение между рубриками реализовать через горизонтальный ScrollView или SegmentedControl.
3. При переключении рубрик содержимое List должно обновляться, а пейджинг работать корректно.
4. Реализовать навигацию в глубину до 3 экранов с использованием кастомного навигационного стека.
5. При выборе ячейки на каждом экране (разделе SegmentedControl) добавить анимацию, имитирующую улет ячейки по кривой вниз (например, как анимация сохранения в избранное).
Современная архитектура мобильных приложений
MVC, MVP, MVI, MVVM, VIPER, RIBs, MOVVER, YARCH и что дальше? Архитектуры множатся, проблемы остаются те же. Научимся целевому выбору архитектурных паттернов и попрактикуемся в проектировании.
Необычная система типов Swift, структуры данных, Generics, Связывание разных частей приложения Observing, Signals, Callbacks. PATs (Protocol with Associated Types)
создать кастомные структуры данных.
22 мая, 20:00 — 21:30
Protocol Oriented Programming (POP), SOA, модуляризация, архитектурные Rx паттерны: Flux/Redux
применять паттерн Inversion of Control;
использовать ServiceLocator;
объяснить в чем польза слоистой архитектуры.
27 мая, 20:00 — 21:30
Домашние задания: 1
ДЗ
Реализация Service Locator и Dependency Injection и изолированности слоев в приложении. 1. Создать ServiceLocator (можно использовать дженерики).
2. Перевести существующие сервисы на использование ServiceLocator.
3. Добавить инжекцию зависимостей в переменные класса, чтобы зависимости были видны сразу, без необходимости скроллинга по файлу.
4. Выделить уровень Core-сервисов (сеть, парсинг, хранение данных).

*5. Вынести Core-сервисы в отдельный пакет SwiftPM.
MVx, VIP, анализ архитектурных паттернов. SOLID, GRASP, Coupling/Cohesion принципы, DI.
разобраться в семействе MV(x) паттернов;
объяснить, что такое модуляризация и как ей пользоваться;
использовать Clean Architecture подход;
рассказать о паттернах в мобильной разработке.
29 мая, 20:00 — 21:30
Домашние задания: 1
ДЗ
Создание модуляризированного приложения с SOA/MVVM/Flux/MV. 1. Выполнить рефакторинг приложения с применением SOA/MVVM/Flux/MV. При реализации на SwiftUI использовать стандартные механизмы: Combine, Signals или EventBus.
2. Модульно организовать приложение, вынеся UI-компоненты в отдельный модуль и импортируя их в местах использования.
3. Создать:
- ServiceLocator (для SOA).
- Вложенные ViewModel (для MVVM).
- Вложенные хранилища (Store) для Flux.
- Контейнер-посредник (для MobX).
- Перевести существующие сервисы на модульную архитектуру.
- Добавить инжекцию зависимостей в переменные классов для повышения их читабельности.

*6. Выделить уровень Core-сервисов (сеть, парсинг, хранение данных).

*7. Вынести Core и другие сервисы в отдельный модуль.
Foundation без сторонних фреймвоков и Swift 6 Standard Library
Загрузим в мозг стройную модель Statements, Expressions и Declaration языка Swift, и попрактикуемся в их использовании. Научимся использовать все возможности String. Научимся управлять "сахарностью" Swift и поймем, что многие библиотеки в проекте вам просто не нужны.
Swift Runtime, компилятор LLVM, продвинутая отладка с помощью LLDB, скриптинг
использовать LLVM: AST, SIL, IR;
знать Method Dispatch;
знать особенности компиляции;
использовать LLDB.
3 июня, 20:00 — 21:30
Sequences и коллекции, асимптотический анализ: O(1), O(N), O(N*log(N)), O(n^2)
использовать Sequence и Collection для реализации собственных структур данных;
объяснить как работают lazy collection, будете понимать концепцию type-erased.
5 июня, 20:00 — 21:30
String: устройство, конвертация с другими типами, регулярные выражения Swift 6
углубиться в работу строковых данных в Swift;
научиться использовать регулярные выражения для поиска строк или получения подстрок.
10 июня, 20:00 — 21:30
Поддержка многоязычности: локализация строк, новый формат XCode 15, кодогенерация и сервисы переводов. Региональные отличия: переводы дат, величин, оцифровывание текста»
научиться делать приложения для экспорта, доступные для иностранных пользователей, чтобы присущие привычки для их местности были учтены;
использовать лучшие практики получения качественного кода с использованием кодоргенерации и линтига ресурсных строк.
17 июня, 20:00 — 21:30
Домашние задания: 1
ДЗ
Использование кастомной структуры данных (Suffix Array). Реализовать для приложения https://ru.wikipedia.org/wiki/Суффиксный_массив

1.1. Создать в приложении поле для ввода текста.

1.2. Показывать в приложении (пункт 3.1) статистику совпадения суффиксов длиной более 3 символов.
Пример:
бра – 2
кад – 3
Перед отображением View разложить все слова из текста на суффиксные последовательности (SuffixSequence).

2.1. Создать SuffixIterator, как показано в уроке.

2.2. Каждое слово из текста, полученного через механизм шаринга, обернуть в SuffixSequence.
В созданном View:

3.1. Отобразить Segmented Control (или Picker в SwiftUI) для переключения между:

3.1.1. Полным списком всех суффиксов. Повторяющиеся суффиксы отмечать количеством совпадений.
Список отсортировать по алфавиту с возможностью переключения сортировки ASC/DESC.

3.1.2. Топ-10 самых популярных трехбуквенных суффиксов, отсортированных по количеству совпадений.
Добавить поиск по списку в пункте 3.1.1.

4.1. Реализовать поиск с использованием debounce на 500 мс из Combine.
Многозадачность
Попрактикуемся в использовании последовательных (serial) и параллельных (concurrent) очередей, в создании управлении DispatchGroup, использовании мьютексов и семафоров и других Locks. Будем знать, как решать проблемы параллельной многозадачности типа Priority inversion и другие.
Проблемы многозадачности и способы их решения, GCD
использовать GCD: QoS, Queues, Main Queue и Main Thread.
19 июня, 20:00 — 21:30
Проблемы многозадачности, GCD(libdispatch), OperationQueue
знать антипаттерны и проблемы: Priority Inversion, Race condition, Deadlock, Resource contention, Starvation, Non-deterministic and Fairness;
избегать антипаттерны;
пользоваться средствами GCD.
24 июня, 20:00 — 21:30
Async/Await, Tasks, Groups
ориентироваться в структурированной многопоточности;
уметь работать с тасками и группами;
использовать инструменты для параллельного запуска задач.
26 июня, 20:00 — 21:30
Actor, @MainActor, Global actors, Distributed actor
иметь полное представление о структурированной многопоточности в Swift;
знать как использовать Actors в Swift.
1 июля, 20:00 — 21:30
Домашние задания: 1
ДЗ
Реализация асинхронного выполнения задач и оценка эффективности подхода. 1. Создать экран с историей поиска суффиксов.

- История должна включать строки текста, которые ранее анализировались на наличие суффиксов.

- При выборе строки из истории должно отображаться окно результатов анализа, включая найденные суффиксы и их статистику.
2. Реализовать структуру данных Job Queue.

- Каждая задача в очереди (Job) должна выполнять поиск суффиксов в отдельной строке текста.

- Реализовать выполнение задач асинхронно с помощью async/await.
3. На экране истории:

- Выводить список строк, анализируемых на наличие суффиксов.

- Для каждой строки отображать в UI ячейки поиска подстроки время, затраченное на выполнение поиска, с использованием @MainActor.
4. Реализовать Job Scheduler:

- Управление очередью задач (например, обработка очереди каждые 1–2 минуты).

- Выводить сводку (Summary) по результатам выполнения задач в отдельной секции интерфейса.



*5. Добавить цветовую индикацию:

- Подсветить лучшее время зеленым цветом, худшее — красным, остальные отображать градацией от зеленого к красному.
Круглый стол
получить ответы на вопросы по: архитектуре, Swift Standard Libraty, Многозадочности в Swift и на любые другие вопросы по курсу.
3 июля, 20:00 — 21:30
CoreML и Vision, нейронные сети и машинное обучение
Научимся внедрять в приложение обученные модели на нейронных сетях. Также разберемся как самому получить модель с помощью AutoML Vision.
CoreML, CreateML, использование обученных моделей нейронных сетей
разобраться как устроен CoreML 3+;
использовать готовые обученные модели.
15 июля, 20:00 — 21:30
Домашние задания: 1
ДЗ
Обучение Классификатора или обжект идентификатора. 1. Выбрать датасет изображений.
2. Обучить классификатор или детектор с помощью CreateML.
3. Встроить функционал распознавания в приложение: использовать камеру или загрузку изображений.

*4. Реализовать распознавание в ARViewContainer.
Обработка видеопотока с помощью CoreML в режиме реального времени c AVFoundation, CoreImage и Metal
объяснить как создавать сегментацию в реальном времени.
17 июля, 20:00 — 21:30
ARKit и RealityKit, LiDAR датчик
использовать ARKit, RealityKit, LiDAR.
22 июля, 20:00 — 21:30
AI инструменты iOS 18: Vision, Neural Engine
разобраться, что дает iOS 18 в нейро-задачах.
24 июля, 20:00 — 21:30
Домашние задания: 1
ДЗ
Совместная разработка AI приложения. Каждый студент реализует одну из функций фоторедактора:

- Определение типа лица и трансформация овала.
- Трансформация глаз.
- Трансформация носа.
- Трансформация губ.
- Трансформация бровей.
Networking и хранение данных
Познакомимся со свежим фреймвоком Network для iOS. Будем использовать Codable для легкой серилизации и десириализации данных. Изучим подходы к хранению данных в приложении. Потренируемся использовать Core Data и Realm, и будем понимать когда какое хранилище использовать.
Передача данных, Transferable протокол, Bluetooth
работать с UTType и Transferable;
работать с CoreBluetooth;
знать Multipeer Connectivity.
29 июля, 20:00 — 21:30
gRPC, кодогенерация, отправка и прием сообщений
изучить Protocol Buffers;
начать использовать gRPC.
31 июля, 20:00 — 21:30
Socket.io, WebSocket и другие сокеты для чатов и мгновенных обновлений, APNs
разбираться в socket.io, WebSocket и других сокетах для чатов и мгновенных обновлений.
5 августа, 20:00 — 21:30
Домашние задания: 1
ДЗ
Использование локальной(mesh) сети для создания приложений. 1. Использовать библиотеку от Apple – Multipeer Connectivity.
2. Реализовать передачу текста между устройствами.
3. Проверить работу на симуляторе, выступающем как одно из устройств.
SwiftData и CloudKit
разобрать строение файловой системы iOS;
познакомиться с некоторыми способами кэширования.
подключение iCloud к SwiftData
7 августа, 20:00 — 21:30
Безопасность: AppSecurity, Keychain и обфускация API ключей, SSL Pinning
AppSecurity;
сохранять важные данные в Keychain;
скрывать данные от декомпиляции ipa файла;
защищать приложение от Man-In-The-Middle аттаки.
12 августа, 20:00 — 21:30
Домашние задания: 1
ДЗ
Реализация поддержки оффлайн режима в приложении. Создать приложение, которое получает данные из сети:

1. Реализовать кэширование данных с использованием одной из технологий: Realm, Files, Firebase, CoreData (предпочтительно использовать новую для вас технологию).
2. Убедиться, что модели данных поддерживают протокол Codable.
- Либо реализовать кэширование другим способом: UserDefaults, NoSQL (CouchDBLite, PinCache), Keychain, SwiftData.
3. Реализовать сохранение данных в файл при выходе с экрана тестирования структуры данных.
4. Загружать сохраненные данные при запуске приложения или повторном входе в экран тестирования.
Должно сохраняться состояние предыдущего тестирования даже после перезапуска приложения.
Создание приложений для Apple Watch, TV, Mac
Потренируемся собирать мультиплтаформу средствами Apple. Разберемся в особенность разработки под watchOS, tvOS, macOS и iPadOS. Будем использовать преимущества SwiftUI для мультиплатформы.
Виджеты, AppClips
делать свои виджеты;
создавать изменяемые виджеты с своим дизайном;
добавлять виджеты к уже существующему приложению.
14 августа, 20:00 — 21:30
watchOS
создать приложение для Apple Watch.
19 августа, 20:00 — 21:30
Shortcuts и Siri интеграция с приложением
использовать App Intents, Siri.
21 августа, 20:00 — 21:30
tvOS
создать приложение для Apple TV.
26 августа, 20:00 — 21:30
visionOS
понимать стек разработки под visionOS;
использовать RealityKit для visionOS;
использовать Reality Compose;
знать как собирать базовый UI под visionOS.
28 августа, 20:00 — 21:30
Домашние задания: 1
ДЗ
Приложение для visionOS. 1. Создать приложение для visionOS.
2. Добавить два WindowGroup.
3. Реализовать Drag and Drop с использованием .dropDestination.
4. Добавить кнопку для добавления объектов usda/usdz.
Мультиплатформенная разработка: перенос на Android, Vulkan/Metal
Разберемся с GPU программированием, как писать общий GPU код под iOS и Android. Познакомимся с аналогом SwiftUI для Android – Jetpack Compose. Научимся собирать мультиплатформенные iOS+Android приложения с помощью Kotlin Multiplatform и Kotlin 1.4
Мультиплатформа для Rich Media: Metal и Vulkan, разработки игр, Video/Image процессинг
писать кроссплатформенный GPU код;
настраивать окружение для этого.
9 сентября, 20:00 — 21:30
Jetpack Compose
сравнить SwiftUI и Compose;
переносить логику разработки на SwiftUI в Compose.
11 сентября, 20:00 — 21:30
Одновременная реализация фич на iOS + Android. Необходимый tool-set
настраивать окружение;
собирать KMM стек для iOS;
решать проблемы с gradle.
16 сентября, 20:00 — 21:30
Домашние задания: 1
ДЗ
Создание мультиплатформенного сетевого слоя с помощью KMM и openapi-generator. 1. Установить IDEA Community Edition: https://www.jetbrains.com/idea/download
2. Создать мультиплатформенный проект, как показано на занятии.
3. Реализовать iOS-приложение на SwiftUI (iosApp).
4. Обновить openapi-generator (brew install openapi-generator).
5. Использовать спецификацию API (recipepuppy_openapi.yaml) или найти другое публичное API.
6. Сгенерировать сетевой слой командой:

`openapi-generator generate -g kotlin -i recipepuppy_openapi.yaml --library multiplatform -o NetworkLayer`

7. Подключить библиотеки io.ktor и kotlinx.serialization в build.gradle.
8. Скомпилировать KMM-проект в IDEA и подключить его как фреймворк в Xcode.
9. Вывести данные (например, рецепты) в List на SwiftUI, реализовав поиск или фильтрацию.
Организация разработки
Немного познакомимся с теорией тестирования, напишем XCTest и UITest, узнаем как правильно проектировать тестируемый код. Изучим как настраивать Continuous Integration (CI) и причем здесь git и git-flow. Также научимся писать работающие резюме и то, что не говорят на собеседованиях, но используют.
Тестирование кода XCTest, UITest, fastlane и CI
собрать CI (Continuous Integration) на fastlane;
использовать XCTest.
18 сентября, 20:00 — 21:30
Как правильно написать резюме и развивать hard-skills
корректно писать резюме;
выбирать работодателя, чтобы развивать свои hard-skills.
23 сентября, 20:00 — 21:30
Домашние задания: 1
ДЗ
Написание работающего резюме. 1. Просмотреть запись занятия с разбором резюме.
2. Доработать собственное резюме.
3. Прислать ссылку или файл для проверки.
Проектная работа
На основе умений и знаний полученных в курсе студент выбирает какой проект будет реализовывать. С нашей стороны будет помощь и наставничество в реализации проекта. Также нами будет предложен экспертный список «Чего не хватает в AppStore» из небольших и средних программ, где вы бы могли себя проявить.

Проект может помочь в трудоустройстве.
Написание приложения с нуля
выбрать и обсудить тему проектной работы;
спланировать работу над проектом;
ознакомиться с регламентом работы над проектом;
генерировать идеи для простых приложений на основе известных «­болей» пользователей;
использовать iOS платформу для генерации идей для приложений.
25 сентября, 20:00 — 21:30
Домашние задания: 1
ДЗ
Проектная работа. 1. Предложить одобренную ранее тему проекта через строку в окне сдачи данного домашнего задания.
2. Сдать ссылку на репозиторий курсового проекта.

В репозитории обязательно должен быть заполнен файл `Readme.md` с описанием проекта.

Варианты размещения приложения:
- Выложить на Github
- TestFlight External Testing (10k users)
- Опубликовать App Store
- Продемонстрировать на симуляторе или устройстве.
Консультация по проектам и домашним заданиям
получить ответы на вопросы по проекту, ДЗ и по курсу.
30 сентября, 20:00 — 21:30
Защита проектных работ
защитить проект и получить рекомендации экспертов.
2 октября, 20:00 — 21:30

Преподаватель

Алексей Соболевский
iOS-разработчик в Яндекс
Окончил Кемеровский государственный университет по специальности «Преподаватель-лингвист». В 2013 году сменил деятельность и самостоятельно обучился web-разработке. Работал в компаниях SilverSite и «Росконтроль», создавал сайты на языках PHP и Java, занимался вёрсткой.

Профессионально занимается iOS-разработкой с 2015-го года. Участвовал в создании чат-приложений, программного обеспечения для грузового такси, внедрял Continius Ingegration и т. д. Работал в компании Mover24 в качестве руководителя команды разработчиков, а также в компании «Новые Облачные Технологии».

На сегодняшний день Алексей работает в Яндексе. Помимо разработки на платформе iOS, активно проводит собеседования кандидатов, претендующих на позицию iOS Developer.

Стек технологий: Objective-C, Swift, UIKit, Foundation, CoreAnimation, Keychain, Associated Domains, SSO, App Groups, TeamCity.
Новое направление: OTUS Kids 👧👦
Курсы для подростков от 10 до 18 лет →