Лекция 3 CS193P Spring 2020 — Reactive UI. Protocols. Layout.

На Лекции 3 курса Стэнфорда  CS193p — «Developing  Application for iOS» («Разработка приложений для iOS») рассматриваются три чрезвычайно важных темы:

  1. Реактивный пользовательский интерфейс (UI).
  2. Протоколы protocol и их комбинация с Generic — мощная сила в Swift.
  3. Система Layout (управление расположением Views) в SwiftUI.

На предыдущей Лекции 2 мы познакомились теоретически и практически с MVVM как архитектурной парадигмой “организации кода”. 

У MVVM много общего с MVC, и основное состоит в том, что и в том, и в другом случае мы пытается отделить Model, которая является бэкендом нашего приложения, от View, которое предстает непосредственно перед пользователем. Обе архитектуры пытаются сделать Model UI НЕзависимой.

Но Views в SwiftUI являются «реактивными». Что имеется в виду под “реактивным”? Когда происходят изменения в Model, они  мгновенно АВТОМАТИЧЕСКИ отображаются во View. 

Для того, чтобы это происходило, нам понадобится в шаблоне MVVM помимо Model и View, ещё один компонент с именем ViewModel. Работа ViewModel состоит в том, чтобы “привязать” (bindView к 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 доступны на платной основе.