Лекция 15. Интеграция с UIKit. CS193P Весна 2021г.

Это Лекция 15 курса Stanford CS193p, весна 2021 года.

Хотя название Лекции «Интеграции с UIKit«, задача этой Лекции — более широкая, заставить работать наше документо-ориентированное приложение EmojiArt на iPhone. До сих пор функциональные возможности приложения EmojiArt в большей степени были ориентированы на iPad. Запуск этого приложения на iPhone показал, что большая часть кода прекрасно адаптируется самой SwiftUI, например, popover на iPad автоматически преобразуется в полноэкранный sheet на iPhone, но не все работает так гладко.

Например, нам пришлось добавить ещё три способа получения фонового изображения background для нашего документа, ибо перетягивание его из Safari, находящегося тут же на экране iPad, в случае iPhone не работает.

Вот эти способы :

  • копирование  и вставка (Copy & Paste) изображения c  Pasteboard
  •  изображение с фотокамеры
  •  изображение из Библиотеки Фотографий (Photo Library)

Для этого мы должны были решить вопрос размещения множества кнопок Button, соответствующих различным способам получения фонового изображения документа, на панели инструментов toolbar, а также вопросы интеграции UIKit API  фотокамеры и Библиотеки Фотографий (Photo Library) в SwiftUI приложение.

Читать далее

Лекция 14. «Документо-ориентированная» архитектура. CS193P Весна 2021г.

Это Лекция 14 курса Stanford CS193p, весна 2021 года.

На этой Лекции профессор подробно, строка за строкой, рассматривает код в главном файле приложения с @main, и очень наглядно демонстрирует, как работает «сцена» Scene. В большинстве случаев вы просто будете использовать одну из двух основных встроенных в SwiftUI “сцен” Scene, которыми являются WindowGroup и DocumentGroup с аргументом newDocument. Есть также DocumentGroup (viewing:) для read-only документов.

WindowGroup и DocumentGroup немного напоминают ForEach для Scenes , но эти ForEach “проходят” не через массив Array “чего-то”. Вместо этого каждая из этих “сцен” Scene создается пользователем либо путем создания «New Window» на Mac, либо путем разделения экрана разными (или одинаковыми) приложениями на iPad. На iPhone создание Scene выполняется только один раз, потому что только одна “сцена” Scene в данный момент находится на iPhone и заполняет собой целый экран. 

WindowGroup — это основной не “документо-ориентированный” встроенный в SwiftUI Scene. Это то, что мы использовали до сих пор в обоих наших приложениях Memorize и EmojiArt.  Внутри WindowGroup мы просто размещаем топовое View, которое хотим видеть на нашем экране. Мы можем делиться нашей ViewModel в виде @StateObject со всеми “сценами” Scene, которые можно создать.

Эти “сцены” Scene немного отличаются для различных платформ и в вашем приложении может быть множество Scenes. Легче всего это представить на Mac, где каждое “окно” — это маленькая “сцена” Scene, все очень, очень просто. На iPhone тоже легко представить, что такое “сцена” Scene, у вас всего одна “сцена” Scene самого верхнего уровня. Но на iPad вы можете даже не осознавать, что там происходит со “сценами» Scenes.

Поэтому профессор не торопится переходить сразу к DocumentGroup. Сначала он дает нам почувствовать в полной мере, что такое «сцена» Scene, оставаясь в пределах WindowGroup и рассматривая попутно такие «Обертки Свойства», как @SceneStorage@AppStorage и @ScaledMetric. Все это сопровождается великолепным демонстрационным примером на iPad. В результате чего мы приходим к тому, что если мы оставим наше приложение EmojiArt в WindowGroup, то всё, на что можно рассчитывать — это автосохранение единственного документа.

Это приводит нас прямо к разговору об архитектуре “документо-ориентированного” приложения в SwiftUI, в котором главным действующим лицом является “документ” наподобие EmojiArt. Конечно, мы хотим, чтобы у каждого документа EmojiArt была своя собственная ViewModel и чтобы каждый документ имел свой отдельный файл. Но кроме этого мы хотим иметь возможность переименовывать, перемещать эти файлы, удалять эти файлы и т.д. и все это в одном приложении.

У SwiftUI есть очень мощный механизм, который заботится обо всем этом вместо нас, и на Лекции 14 профессор учит нас использовать этот механизм, который называется DocumentGroup. Он превращает EmojiArt в многодокументное приложение и позволяет ему работать как “родному” приложению как на iOS, так и на Mac. Для этого не требуется много кода. 

Читать далее

Лекция 6. Протоколы protocol. Геометрические фигуры Shape.CS193P Spring 2021.

Это шестая Лекция курса Stanford CS193p, весна 2021 года, и на этой лекции профессор рассматривает последний элемент списка разновидностей ТИПов Swift — протоколы protocol. Протоколы protocol, очень, очень важны в SwiftUI, кроме того, эта разновидность ТИПа Swift в наибольшей степени отличается от других языков, которые вы когда либо видели.

Надо сказать, что тема протоколов protocol в этой году представлена значительно шире и подробнее, чем когда-либо в стэнфордских курсах CS193P. Начиная от использования протоколов protocol в синтаксических конструкциях Swift и SwiftUI как ограничивающего «поведения» наподобие Identifiable, Hashable, Equatable, CustomStringConvertible и кончая возможностью совместного использования кода в расширениях extension протоколов protocol. К этому он добавляет «связку» protocolGenerics, которая является фундаментальной основой протокольно-ориентированного программирования. Профессор никогда не углублялся в эту тему, считая ее продвинутой в языке Swift, но на этой Лекции она представлена в полном объёме. Здесь также присутствует тема наследования протоколов” (protocol inheritance), не путать с наследованием классов (class inheritance), Self-ссылочные протоколы наподобие Equatable, View, которые не могут использоваться как нормальные ТИПы.

Читать далее

Лекция 5. Свойства Layout @ViewBuilder. CS193P Spring 2021.

Это пятая Лекция курса Stanford CS193p, весна 2021 года, и на этой лекции профессор затронул множество тем, связанных как со SwiftUI, так и непосредственно с языком программирования Swift

По SwiftUI рассматриваются четыре чрезвычайно важных темы:

  1. @State.
  2. Система Layout (управление расположением Views) в SwiftUI.
    1. HStack и VStack.
    2. LazyHStack и LazyVStack, LazyHGrid и LazyVGrid.
    3. GeometryReader. CGSize, CGFloat, CGRect.
    4. ZStack и .background и .overlay.
  3. View модификаторы
  4. @ViewBuilder. 

Что касается языка программирования Swift, то профессор Пол Хэгерти продолжает выполнять своё обещание рассказывать о Swift «с нуля» и на этой Лекции 5 освещает темы, которые проще всего показать на демонстрационных примерах:

  1. Управление доступом (private, private (set) и другие).
  2. Вычисляемые свойства (get{} и set {}).
  3. Расширения extension
  4. Функциональное программирование. 
  5. Наблюдатели свойств (Property Observer) и их отличие от вычисляемых свойств. 
  6. Оформление констант в Swift.
  7. typealias, «вывод ТИПа из контекста» (inference),  “подчеркивание” “ _” внешнего имени параметра.

Читать далее

Лекция 4. Больше о MVVM enum Optional. CS193P Spring 2021.

Это четвертая Лекция курса Stanford CS193p, весна 2021 года, и она сразу начинается с продолжения демонстрационного примера прошлой Лекции 3, на которой были сконструированы модель Model и ViewModel для карточной игры «на запоминание» MemorizeView  (то есть UI) мы создали на Лекциях 1и 2. На этой Лекции архитектура MVVM реализуется во всей своей реактивной мощи.

После того, как MVVM заработает, профессор возвращается к слайдам, чтобы вкратце поговорить о двух вещах. Первая  — это еще один системный ТИП Swift, называемый перечислением enum, а вторая — это специальная версия перечисления enum, называемая Optional. Наверное, это одно из самых важных перечислений enum, если не самое главное enum во всем Swift.

Читать далее

Лекция 3. MVVM и система ТИПов в Swift. CS193P Spring 2021.

Это третья Лекция курса Stanford CS193p, весна 2021 года. На первых двух Лекциях мы много узнали о том, как создавать UI, используя SwiftUI на примере карточной игры «на запоминание» Memorize

На этой неделе мы узнаем, как “подцепить” наш UI к логике, которая знает, как играть в карточную игру “на совпадение”. Но сначала профессор рассматривает две действительно важные концептуальные идеи: MVVM и системные ТИПы языка программирования Swift.

MVVM

MVVM — это, по сути, способ организации всего кода в нашем приложении. 

Системные ТИПы в Swift, очевидно, позволяют нам делать все, что мы делаем в языке программирования Swift и, следовательно, в SwiftUI.

MVVM, как и MVC, разделяет весь код нашего приложения на код пользовательского интерфейса (UI), то есть то, что мы называем View, от логики нашего приложения, которую мы называем моделью Model.

Model —  полностью UI НЕзависима. Model вбирает в себя все данные Data и логику Logic, которые  описывают “ЧТО” делает ваше приложение. View — это то, «КАК» ваше приложение предстает перед пользователем,  Model — это то, “ЧТО”  ваше приложение делает на самом деле. Model — единственный источник ИСТИНЫ (“Truth”) для данных, которые представляют нашу игру. 

 View всегда будет отражением текущего состояния Model. View по большому счету вообще не имеет состояния State (то есть оно stateless). Ему не нужно хранить слишком много информации о состояниях State, потому что ИСТИНА (“Truth”) о состоянии игры всегда находится в Model. В демонстрационном приложении Memorize, который мы делали на прошлой неделе, всё своё время мы проводили за написанием кода для переменной var body нашего View. Этот var body всегда должен что-то возвращать на основе текущего состояния Model. Views — неизменны (immutable). Их нельзя изменить. Следовательно, нет другого способа изменить наш View, кроме как целиком перестроить var body. Следовательно, 100% того, как  выглядит View, определяется исключительно тем, что находится в  реализации переменной var body.

Мы называем этот вид кодирования декларативным, потому что мы декларируем в переменной var body, как выглядит пользовательский интерфейс (UI) нашего View. Конец истории. Это противоположно виду кодирования, к которому мы привыкли и который мы называем императивным.

Читать далее

Лекция 2. Узнаем ещё больше о SwiftUI. CS193P Spring 2021.

Это вторая Лекция курса Stanford CS193p, весна 2021 года. В первой лекции мы начали создавать карту с некоторым текстом Text («Hello, world!») («Привет мир!») для карточной игры «на запоминание» Memorize

В первой Лекции мы научились модифицировать текст Text, изменив его цвет foregroundColor(.red), создав вокруг него Отступы padding(), а затем объединив его с другим View, прямоугольником с закругленными углами RoundedRectangle, с помощью ZStack

На Лекции 2 мы сделаем еще больший скачок и создадим несколько карт вместо одной. Профессор не создает полную сетку из карт за один раз…

… а делает это постепенно, шаг за шагом, по ходу дела проводя обучение как языку программирования Swift «с нуля», как он и обещал, так и SwiftUI, постепенно открывая его поразительные возможности. Я вкратце перечислю его шаги.

Читать далее

Лекция 1. Начало работы со SwiftUI. Часть 2. CS193P Spring 2021.

Это продолжение Лекции 1. Начало работы со SwiftUI. CS193P Spring 2021.

Начало Лекции 1 можно посмотреть здесь.

Мы вернемся к синтаксису some View через секунду и поймем, что на самом деле это означает. Но сначала я хочу поговорить об этом небольшом фрагменте кода:

Что это такое? Это просто код, который следует сразу после переменной var body: some View. На самом деле это функция, и я сказал вам, что Swift — это язык функционального программирования, а в языках функционального программирования функции действительно очень важны.

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

Возможно, для некоторых из вас, кто программирует на Java или на подобных языках, иметь возможность разместить функции прямо посреди вашего кода, покажется неуместным и будет немного раздражать, но вы быстро к этому привыкните, потому что в языках функционального программирования функции есть везде. Они просто абсолютно везде.

Читать далее