Открытый вебинар «Онлайн-интенсив, день 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 ₽ 85 000 ₽
5 месяцев
Начало 27 ноября

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

  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 5 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.
27 ноября, 20:00 — 21:30
Лектор: Ексей Пантелеев
Домашние задания: 1
ДЗ
Создание каркаса приложения на SwiftUI. Создать флоу экранов на SwiftUI
1. Добавить TabView

2. На втором табе сделать List с обернутый в NavigationView

2.1 Из листа должны быть переходы с NavigationLink

3. На третьем табе должна быть кнопка открывающая модальное окно
4. На первом табе должна быть кнопка открывающая второй таб и один из пунктов там
5. Протестировать на iPad/iPhone симуляторах, со сменой ориентации девайса
*6. Добавить один UIKit компонент через UIViewRepresantable
SwiftUI List, List с кастомным лейаутом, Hosting ViewControllers
понимать, в каком состоянии приложение;
добавлять логику на изменение состояния приложения;
знать как устроен UIKit и его иерархия классов;
делать навигацию в SwiftUI разными способами.
4 декабря, 20:00 — 21:30
Лектор: Ексей Пантелеев
Создание кастомных Shape, SwiftUI Drawing and Animation API
работать с CALayer и понимать систему координат, используемую в CoreGraphics;
программно рисовать Shapes в SwiftUI;
использовать анимацию в SwiftUI.
9 декабря, 20:00 — 21:30
Лектор: Николай Бакланов
Использование NavigationView, TabView. Нативная навигация, бекпорты и фреймворки для поддержки всех функций
использовать NavigationView и TabView в SwiftUI;
использовать back ports и сторонних решений;
организация deeplinks и тестирования навигации.
11 декабря, 20:00 — 21:30
Лектор: Сергей Балалаев
Отображение структурированных данных, List, пейджинг, кастомные компоненты на UIViewRepresentable, принципы HIG
реализовывать пейджинг на SwiftUI;
кодогенерить Network слой в ДЗ;
привязывать List к реальному API с помощью кодогенерации.
16 декабря, 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)
создать кастомные структуры данных.
18 декабря, 20:00 — 21:30
Лектор: Ексей Пантелеев
Protocol Oriented Programming (POP), SOA, модуляризация, архитектурные Rx паттерны: Flux/Redux
применять паттерн Inversion of Control;
использовать ServiceLocator;
объяснить в чем польза слоистой архитектуры.
23 декабря, 20:00 — 21:30
Лектор: Анна Жаркова
Домашние задания: 1
ДЗ
Реализация Service Locator и Dependency Injection и изолированности слоев в приложении. 1. Создать ServiceLocator (можно на дженериках)
2. Перевести существующие сервисы на него
3. Добавить инжектинг в переменные инстанса класса, чтобы в каждом классе можно было видеть зависимости, не скролля файл
4. Выделить уровень Core сервисов (сеть, парсинг, хранение).
*5. Вынести Core в пакет Swift PM
MVx, VIP, анализ архитектурных паттернов. SOLID, GRASP, Coupling/Cohesion принципы, DI.
разобраться в семействе MV(x) паттернов;
объяснить, что такое модуляризация и как ей пользоваться;
использовать Clean Architecture подход;
рассказать о паттернах в мобильной разработке.
25 декабря, 20:00 — 21:30
Лектор: Анна Жаркова
Домашние задания: 1
ДЗ
Создание модуляризированного приложения с SOA/MVVM/Flux/MV. Можно использовать в качестве основы реализованное домашнее задание по прошлому занятию.

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

1. 1.1. Внутри приложения поле ввода для текста

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

2.1 Как показано в уроке создать SuffixIterator

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

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

3.1.1 Листом всех суффиксов, повторяющиеся помечать кол-вом, остортировать по алфавиту, сделать переключение сортировки ASC/DESC

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

4.1 Искать по совпадением используя debounce в 500мс из Combine
Многозадачность
Попрактикуемся в использовании последовательных (serial) и параллельных (concurrent) очередей, в создании управлении DispatchGroup, использовании мьютексов и семафоров и других Locks. Будем знать, как решать проблемы параллельной многозадачности типа Priority inversion и другие.
Проблемы многозадачности и способы их решения, GCD
использовать GCD: QoS, Queues, Main Queue и Main Thread.
27 января, 20:00 — 21:30
Лектор: Олег Максименко
Проблемы многозадачности, GCD(libdispatch), OperationQueue
знать антипаттерны и проблемы: Priority Inversion, Race condition, Deadlock, Resource contention, Starvation, Non-deterministic and Fairness;
избегать антипаттерны;
пользоваться средствами GCD.
29 января, 20:00 — 21:30
Лектор: Николай Бакланов
Async/Await, Tasks, Groups
ориентироваться в структурированной многопоточности;
уметь работать с тасками и группами;
использовать инструменты для параллельного запуска задач.
3 февраля, 20:00 — 21:30
Лектор: Сергей Балалаев
Actor, @MainActor, Global actors, Distributed actor
иметь полное представление о структурированной многопоточности в Swift;
знать как использовать Actors в Swift.
5 февраля, 20:00 — 21:30
Лектор: Ексей Пантелеев
Домашние задания: 1
ДЗ
Реализация асинхронного выполнения задач и оценка эффективности подхода. 1. Сделать экран историю поиска Суффиксов на основе предыдущей домашнее задания
2. Реализовать структуру данных Job Queue
3. Каждый поиск должен выполнятся в отдельной таске(Job) асинхронно (async/await)
4. Экрана сделать List с замером времени поиска каждого суффикса и выводом времени выполнения поиска в UI (@MainActor)
5. Создать эктор Job Scheduler
*6. Красить в зеленый лучшее время и в красный худшее, или градацие от зеленого к красному
*7. Сделать Job для Job Scheduler которая раз в 1-2 минуты делать Summary по поискам
Круглый стол
получить ответы на вопросы по: архитектуре, Swift Standard Libraty, Многозадочности в Swift и на любые другие вопросы по курсу.
10 февраля, 20:00 — 21:30
Лектор: Ексей Пантелеев
CoreML и Vision, нейронные сети и машинное обучение
Научимся внедрять в приложение обученные модели на нейронных сетях. Также разберемся как самому получить модель с помощью AutoML Vision.
CoreML, CreateML, использование обученных моделей нейронных сетей
разобраться как устроен CoreML 3+;
использовать готовые обученные модели.
12 февраля, 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.
19 февраля, 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.
5 марта, 20:00 — 21:30
Лектор: Олег Максименко
gRPC, кодогенерация, отправка и прием сообщений
изучить Protocol Buffers;
начать использовать gRPC.
10 марта, 20:00 — 21:30
Лектор: Ексей Пантелеев
Socket.io, WebSocket и другие сокеты для чатов и мгновенных обновлений, APNs
разбираться в socket.io, WebSocket и других сокетах для чатов и мгновенных обновлений.
12 марта, 20:00 — 21:30
Лектор: Сергей Балалаев
Домашние задания: 1
ДЗ
Использование локальной(mesh) сети для создания приложений. 1. Использовать для создания библиотеку от Apple -- Multipeer Connectivity
2. Сделать передачу текста с устройства на устройство
3. Multipeer Connectivity позволяет тестировать когда один из девайсов симулятор
SwiftData и CloudKit
разобрать строение файловой системы iOS;
познакомиться с некоторыми способами кэширования.
подключение iCloud к SwiftData
17 марта, 20:00 — 21:30
Лектор: Анна Жаркова
Безопасность: AppSecurity, Keychain и обфускация API ключей, SSL Pinning
AppSecurity;
сохранять важные данные в Keychain;
скрывать данные от декомпиляции ipa файла;
защищать приложение от Man-In-The-Middle аттаки.
19 марта, 20:00 — 21:30
Лектор: Олег Максименко
Домашние задания: 1
ДЗ
Реализация поддержки оффлайн режима в приложении. Создать приложение, которое будет получать данные из сети.
1. Реализовать кэширование на Realm/Files/Firebase/CoreData (лучше то, что еще не использовали)
2. Проверить, что модели поддерживают протокол Codable в вашем каркасе приложения
2.1 Либо реализовать кеш другим способом (UserDefaults, NoSQL(CoachDBLite, PinCache, ...), Keychain :), Files, SwiftData, Realm)
3. Реализовать сохранение в файл при возвращении из экрана тестирования структуры данных
4. Чтение сделать в момент запуска приложения или перезахода в экран тестирования структуры данных
5. Должно сохраняться предыдущее состояние тестирования даже при перезапуске приложения
Создание приложений для Apple Watch, TV, Mac
Потренируемся собирать мультиплтаформу средствами Apple. Разберемся в особенность разработки под watchOS, tvOS, macOS и iPadOS. Будем использовать преимущества SwiftUI для мультиплатформы.
Виджеты, AppClips
делать свои виджеты;
создавать изменяемые виджеты с своим дизайном;
добавлять виджеты к уже существующему приложению.
24 марта, 20:00 — 21:30
Лектор: Анна Жаркова
watchOS
создать приложение для Apple Watch.
26 марта, 20:00 — 21:30
Лектор: Николай Бакланов
Shortcuts и Siri интеграция с приложением
использовать App Intents, Siri.
31 марта, 20:00 — 21:30
Лектор: Ексей Пантелеев
tvOS
создать приложение для Apple TV.
2 апреля, 20:00 — 21:30
Лектор: Олег Максименко
visionOS
понимать стек разработки под visionOS;
использовать RealityKit для visionOS;
использовать Reality Compose;
знать как собирать базовый UI под visionOS.
7 апреля, 20:00 — 21:30
Лектор: Ексей Пантелеев
Домашние задания: 1
ДЗ
Приложение для visionOS. 1. Создать приложение для visionOS
2. Добавить 2 WindowGroup
3. Реализовать с помощью .dropDestination Drag and Drop
4. Добавить кнопку по нажатию добавляющую usda/usdz обьект
Круглый стол
получить ответы на вопросы по: экосистеме Apple, сетевому слою, CoreML и на любые другие вопросы по курсу.
9 апреля, 20:00 — 21:30
Лектор: Ексей Пантелеев
Мультиплатформенная разработка: перенос на 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 код;
настраивать окружение для этого.
21 апреля, 20:00 — 21:30
Лектор: Николай Бакланов
Jetpack Compose
сравнить SwiftUI и Compose;
переносить логику разработки на SwiftUI в Compose.
23 апреля, 20:00 — 21:30
Лектор: Николай Бакланов
Одновременная реализация фич на iOS + Android. Необходимый tool-set
настраивать окружение;
собирать KMM стек для iOS;
решать проблемы с gradle.
28 апреля, 20:00 — 21:30
Лектор: Анна Жаркова
Домашние задания: 1
ДЗ
Создание мультиплатформенного сетевого слоя с помощью KMM и openapi-generator. 1. Установить IDEA Community Edition https://www.jetbrains.com/idea/download
2. Создать мультиплатформенный проект, как было показано на занятии
3. Пересоздать для SwiftUI iosApp, как было показано на занятии
4. Обновить openapi-generator c помощью brew install openapi-generator
5. Можно взять из материалов recipepuppy_openapi.yaml (нужно в Info.plist разрешить http) или найти другое публично апи и написать спеку https://github.com/public-apis/public-apis
6. Сгенерировать сетевой слой openapi-generator generate -g kotlin -i recipepuppy_openapi.yaml --library multiplatform -o NetworkLayer (показывается на занятии)
7. Подключить в build.gradle io.ktor и kotlinx.serialization
8. Сбилдить KMM в IDEA и затем app фреймвок в Xcode
9. Вывести рецепты в SwiftUI лист по нескольким ингредиентам или поиском (частично показано в конце занятия)
Организация разработки
Немного познакомимся с теорией тестирования, напишем XCTest и UITest, узнаем как правильно проектировать тестируемый код. Изучим как настраивать Continuous Integration (CI) и причем здесь git и git-flow. Также научимся писать работающие резюме и то, что не говорят на собеседованиях, но используют.
Тестирование кода XCTest, UITest, fastlane и CI
собрать CI (Continuous Integration) на fastlane;
использовать XCTest.
30 апреля, 20:00 — 21:30
Лектор: Ексей Пантелеев
Как правильно написать резюме и развивать hard-skills
корректно писать резюме;
выбирать работодателя, чтобы развивать свои hard-skills.
5 мая, 20:00 — 21:30
Лектор: Ексей Пантелеев
Домашние задания: 1
ДЗ
Написание работающего резюме. 1. Посмотреть запись занятия с разбором резюме
2. Доработать свое
3. Прислать ссылкой или файлом
Проектная работа
На основе умений и знаний полученных в курсе студент выбирает какой проект будет реализовывать. С нашей стороны будет помощь и наставничество в реализации проекта. Также нами будет предложен экспертный список «Чего не хватает в AppStore» из небольших и средних программ, где вы бы могли себя проявить.

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

Варианты размещения приложения:
–Выложить на Github
–TestFlight External Testing (10k users)
–Опубликовать App Store
–Показать на экране в симуляторе/устройство
Консультация по проектам и домашним заданиям
получить ответы на вопросы по проекту, ДЗ и по курсу.
12 мая, 20:00 — 21:30
Лектор: Ексей Пантелеев
Защита проектных работ
защитить проект и получить рекомендации экспертов.
14 мая, 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.