На Лекции 3 курса Стэнфорда CS193p — «Developing Application for iOS» («Разработка приложений для iOS») рассматриваются три чрезвычайно важных темы:
- Реактивный пользовательский интерфейс (
UI
). - Протоколы protocol и их комбинация с
Generic
— мощная сила вSwift
. - Система
Layout
(управление расположением Views) вSwiftUI
.
На предыдущей Лекции 2 мы познакомились теоретически и практически с MVVM
как архитектурной парадигмой “организации кода”.
У MVVM
много общего с MVC
, и основное состоит в том, что и в том, и в другом случае мы пытается отделить Model, которая является бэкендом нашего приложения, от View, которое предстает непосредственно перед пользователем. Обе архитектуры пытаются сделать Model UI
НЕзависимой.
Но Views в SwiftUI
являются «реактивными». Что имеется в виду под “реактивным”? Когда происходят изменения в Model, они мгновенно АВТОМАТИЧЕСКИ отображаются во View.
Для того, чтобы это происходило, нам понадобится в шаблоне MVVM
помимо Model и View, ещё один компонент с именем ViewModel
. Работа ViewModel
состоит в том, чтобы “привязать” (bind) View к Model. Как только происходят хоть какие-то изменения в Model, View тут же отражает эти изменения.
MVVM
в SwiftUI
работает в связке с концепцией “Реактивного” пользовательского интерфейса (UI
). Необходимо придерживаться MVVM
при работе в SwiftUI
и тогда вы АВТОМАТИЧЕСКИ сможете воспользоваться реактивными возможностями SwiftUI
.
Способ, каким мы заставляем ViewModel
участвовать в реализации реактивной части, это использование механизма constraints and gains (ограничения и выгоды) с именем ObservableObject. Профессор очень подробно рассказывает о протоколе protocol ObservableObject, о переменной var objectWillChange, о Property Wrapper (“обертке свойства”) @Published, о другом Property Wrapper (обертке свойства”) с именем @ObservedObject.
Следующая важная тема — протоколы protocol. Протоколы выглядит для нас как “урезанный” класс class или структура struct. “Урезанный” потому, что у него есть переменные vars и функции funcs, но нет реализации.
Протокол protocol — это способ для ТИПов (структур/классов/перечислений/других протоколов) “сказать”, на ЧТО они СПОСОБНЫ.
Профессор предлагает представить протокол protocol как constraints and gains (ограничения и выгоды). он использует эту ассоциацию потому, что она хорошо рифмуется и легко запоминается, но и работает именно так.
Протоколы protocol становятся ещё более мощными при комбинации с Generics
и вы должны уметь их создавать.
Последней темой Лекции 3 является совершенно другая тема, которая называется Layout
, то есть, как мы решаем, ГДЕ располагать все наши Views на экране. Способ, каким SwiftUI делает это, — удивительно прост. Это одна из наиболее элегантных вещей во всём SwiftUI
. Нужно всего 3 шага, чтобы расположить что-либо с помощью SwiftUI
и они подробно описаны в Лекции 3.
Подробно рассматривается, как распределяют своё пространство стеки HStack и VStack, почему ForEach “перекладывает” распределение пространства между своими Views на другие контейнеры. например, на стеки HStack и VStack, что такое Spacer и Divider, что такое «гибкие» и «негибкие» Views, что такое .layoutPriority, что такое модификаторы и как они участвуют в Layout
, что такое GeometryReader, как участвует SafeArea в Layout
, что такое .frame, .position, .offset.
В конце Лекции 3 представлена пара демонстрационных примеров на тему Layout
.
Код демонстрационного примера для Лекции 3 находится на Github для iOS 13 в папке Memorize L3.
Русскоязычный неавторизованный конспект Лекции 3, хронометрированный через каждые 5 минут, и представленный в виде PDF-файла, который можно скачать и использовать offline, а также в формате Google Doc доступны на платной основе.