Стэнфордский курс CS193P iOS 14 + SwiftUI 2. Весна 2021 г.

Лекции курса CS193P Стэнфордского университета «Разработка приложений для iOS с использованием SwiftUI» для весеннего семестра 2021 года снова были прочитаны для студентов в режиме онлайн из-за новой вспышки коронавируса. Стэнфорд постепенно (по 2 Лекции в неделю) делает видео этих лекций доступными для всех, размещая их на своем канале YouTube.

Это не просто практический курс по программированию на iOS, но также курс о том, КАК сконструирована система разработки SwiftUI, что очень важно для обучения наших CS (Computer Science — Информатика) студентов, поэтому мы стараемся посвятить часть лекционного времени тому, КАК SwiftUI делает то, что он делает, а не только как повернуть в нем те или иные “ручки”, чтобы заставить его делать нужные нам вещи.

Учебная программа курса CS193P Spring 2021 в основном похожа на версию Spring 2020. Единственным исключением являются лекции 11 и 12 2020 года (приложение Enroute), которые содержат материалы, не охваченные в 2021 году. Поэтому, если вы находитесь в середине просмотра курса CS193P Spring 2020, то вы сможете переключиться прямо на середину версии 2021 года, когда она станет доступной.

Если вы уже просмотрели версию 2020 года полностью, просмотр видео 2021 года может иметь для вас определенную ценность, поскольку с 2020 года в SwiftUI было внесено довольно много улучшений.

Если вы новичок курса CS193P, вам определенно нужно будет посмотреть только видео 2021 года.

Читать далее

Задание 3 Stanford CS 193P Spring 2020. Игра Set.

Решение обязательных и дополнительных пунктов.

Содержание

Цель этого задания состоит в том, чтобы дать вам возможность создать свое первое приложение полностью с «нуля» и самостоятельно. Оно похоже на первые два Задания, которое помогло обрести вам уверенность, но и достаточно отличающееся, чтобы дать вам полную свободу для накопления опыта!

Так как цель этого Задания — создать приложение с «нуля», то не начинайте с кода Задания 2, начинайте с New → Project в Xcode. .

Текст Домашнего Задания 3 на английском языке доступен на  сайте Stanford CS193P (Lecture 6 Assignment 3). На русском языке вы можете посмотреть и скачать Задание 3 здесь.

Вы, конечно, захотите освежить в памяти правила игры Set.

Мое решение Задания 3 находятся на Github  для iOS 14 и Xcode 12.

Пункты 1, 2 и 6 обязательные

1. Реализуйте игру Set в версии соло (для одного игрока).

2. Когда ваша игра запускается в первый раз, карты на короткое время не должны отображаться, но как только они появляются, необходимо немедленно сдать 12 карт, заставляя их «прилетать» из случайных мест за пределами экрана.

6. Пользователи должны иметь возможность выбрать до 3 карт, прикоснувшись к ним, чтобы попытаться создать Set (т. е. 3 совпадающие карты (matching) в соответствии с правилами игры Set). Пользователю должно быть ясно видно, какие карты уже были выбраны.

Читать далее

По следам CS193P 2020 — SwiftUI Playing Card Memorize

Меня настолько впечатлила легкость интеграции UIViews в  SwiftUI, с одной стороны, и возможность настройки карточной игры «на совпадение» MemorizeGame <ContentCard> на любое содержание карты ContentCard, с другой стороны, что я решила попробовать создать такую же игру Memorize с игральными картами PlayingCard вместо карт с эмоджи. Моя задача облегчалась тем, что Пол Хэгерти уже создавал игральную карту на прошлом курсе CS193P 2017 Лекция 6, и я могу взять эту досконально  спроектированную игральную карту в свой проект в неизменном виде:

Помимо работы с игральными картами, я хочу расширить логику и UI игры Memorize на игру с картами, которые могут быть заменены в случае совпадения на новые карты из колоды карт. Эта логика и UI могут пригодится при выполнении Задания 3 курса CS193P 2020, в котором требуется разработать приложение для игры Set, в которой также есть колода карт, оговариваются условия «совпадения», но не 2-х карт, как в нашей игре, а 3-х.

Читать далее

Лекция 14 CS193P Spring 2020 — UIKit интеграция.

На Лекции 14 курса Стэнфорда CS193p — «Developing  Application for iOS» Spring 2020 («Разработка приложений для iOS». Весна 2020) Пол Хэгерти продолжает излагать темы, которые не являются обязательными на этом курсе, но могут реально понадобится студентам в создании полноценных финальных проектов. Лекция 14 посвящена очень важной «возможности SwiftUI  — интеграции с UIKit

UIKit — это старый способ разработки приложений для iOS. Когда появился SwiftUI, то он в значительной степени делал всё, что делает UIKit, но осталось всё же несколько “фишек” в UIKit, которых сейчас нет в SwiftUI, а вы бы хотели их использовать, поэтому в SwiftUI появился специальный API, позволяющий очень легко интегрировать в него UIKit компоненты.

Если вы — уже действующий разработчик приложения для iOS и у вас есть куча UIKit кода, то, конечно же, вы бы хотели использовать его при переходе на SwiftUI, так что этот API интеграции вам также очень пригодится.

В UIKit нет MVVM, вместо этого там то, что  называется MVC (Model View  Controller). В MVC архитектуре Views как бы сгруппированы вместе и управляются тем, что называется Controller.

В SwiftUI у нас нет никаких Controllers, там Views  — это просто Views, и мы представляем их на экране, когда мы хотим. Но в UIKit Views размещаются на экране совершенно по-другому. По сути, мы представляем на экране Controller, а уже Controller управляет своими Views. Из-за того, что у нас есть Controller интеграция между SwiftUI и UIKit требует 2-х точек интеграции.

Читать далее

Лекция 13 CS193P Spring 2020 — Постоянное хранение (Persistence).

На Лекции 13 курса Стэнфорда CS193p — «Developing  Application for iOS» Spring 2020 («Разработка приложений для iOS». Весна 2020) Пол Хэгерти продолжает излагать темы, которые не являются обязательными на этом курсе, но могут реально понадобится студентам в создании полноценных финальных проектов. Рассматривается уже третья из таких дополнительных тем, а именно обзор всех возможных систем постоянного хранения (Persistence) в iOS. 

  • UserDefaults. Простая. Ограниченная (только Property Lists). Очень небольшая по объему.
  • Codable / JSON. Понятный способ преобразования практически любой структуры данных в формат JSON обмена данными и наоборот.
  • UIDocument. Интегрирует приложение Files и данные, воспринимаемые пользователем как «документы” в ваше приложение. До iOS 13 являлся UIKit ориентированным, в iOS 14 в SwiftUI 2.0 появился DocumentGroup.
  • Core Data Мощная. Объектно-ориентированная. Элегантная интеграция со SwiftUI.
  • Cloud Kit. Запоминание данных в базе данных, расположенной в «облаке» (то есть в интернете), которая работает полностью асинхронно. Следовательно, данные появляются на любых устройствах пользователя. Это очень простая в использовании база данных, у нее есть основные операции базы данных, но не такие полноценные как у Core Data, однако она отлично работает с Core Data (так что ваши данные в Core Data могут также появиться на всех устройствах)
  • FileManager/URL/DataЗапоминание данных в Unix файловой системе в iOS.

Все эти способы хранения, за исключением Codable / JSON, имеют API ещё ДО-Swift эпохи. 

Читать далее

Лекция 12 CS193P Spring 2020 — Core Data.

На Лекции 12 курса Стэнфорда CS193p — «Developing  Application for iOS» Spring 2020 («Разработка приложений для iOS») Пол Хэгерти продолжает излагать темы, которые не являются обязательными на этом курсе, но могут реально понадобится студентам в создании полноценных финальных проектов. Рассматривается уже вторая из таких дополнительных тем, а именно супер эффективная объектно-ориентированная система постоянного хранения в iOS — база данных Core Data

В начале профессор рассматривает теоретические основы Core Data и вопросы её интеграции в SwiftUI. Потом следует большой демонстрационный пример, цель которого состоит в преобразовании приложения Enroute таким образом, чтобы использовать базу данных Core Data для хранения всей информации, поступающей от трекера полетов FlightAware, и построении полноценного UI исключительно на просмотре базы данных Core Data.

И, надо отдать должное Apple, она решает проблему взаимодействия столь разных Миров как Core Data и SwiftUI фантастически элегантным способом.

Читать далее

Лекция 11 CS193P Spring 2020 — Enroute Picker.

На Лекции 11 курса Стэнфорда  CS193p — «Developing  Application for iOS» («Разработка приложений для iOS») Пол Хэгерти констатирует, что основные темы SwiftUI уже пройдены на предыдущих 10 Лекциях и сейчас студенты должны сосредоточиться на создании финального проекта. Пол Хэгерти выкладывает Лекции 11-14 в поддержку тем, которые не являются обязательными, но могут реально понадобится студентам в создании полноценных финальных проектов. На Лекции 11, первой из этой череды Лекций, рассматривается очень важная тема — Picker (средство выбора). Эта тема рассматривается в контекст нового приложения, не Memorize и не Emoji Art, это приложение под названием Enroute.

Приложение Enroute, по сути, использует API, которое доступно в интернете от компании FlightAware, и вы можете видеть, что оно действительно загружает информацию о рейсах. На рисунке в заголовке этого поста вы видите, что приложение Enroute загружает рейсы, которые находятся по пути в Сан-Франциско в международный аэропорт KSFO. Это код аэропорта. Нам сообщают, например, что SkyWest рейс прибывает сегодня в 11:42, то есть через 2 минуты. Он летит из Лос-Анджелеса. Нам сообщают обо всех рейсах, различных авиакомпаний, различных аэропортах отправления и т.д. В отличие от других демонстрационных примерах, которые мы разрабатывали «с нуля», на Лекции 11 мы получаем готовое начальное приложение Enroute, которое способно загружать рейсы с сайта FlightAware. 

Наша задача на Лекции 11 состоит в том, чтобы разработать UI, с помощью которого можно будет осуществлять фильтрацию рейсов по аэропорту прибытия destination, по аэропорту отправления origin, по авиакомпании airline и по тому, находятся рейсы уже в воздухе или еще ожидают вылета на земле inTheAir. Надо сказать, типичная задача для многих приложений. И нам будет необходим Picker, чтобы сделать это, потому что мы собираемся выбирать аэропорты, выбирать авиакомпании и делать другие подобные вещи. Picker отлично для этого подходит. Весь демонстрационный пример Лекции 11 посвящен созданию такого UI в виде Редактора Фильтра с помощью Picker (95% времени) и Toggle (5% времени).

Читать далее

Лекция 10 CS193P Spring 2020 — Модальное представление и Навигация.

На Лекции 10 курса Стэнфорда  CS193p — «Developing  Application for iOS» («Разработка приложений для iOS») Пол Хэгерти показывает очень большой демонстрационный пример, почти полностью посвященный темам, относящимся к представлению Views на экране. 

В некотором смысле мы уже знаем, как это можно делать. ForEach выводит Views на экран и убирает с экрана. А также if-elses внутри @ViewBuilders заставляет Views появляться и уходить с экрана. Но на Лекции 10 мы будем говорить о больших группировках Views, Views, которые могут занять весь экран полностью, Views, которые могут управляться своими собственными MVVMs. Мы еще не видели приложений, у которых есть множество ViewModels. Но, конечно, большинство больших программ имеют много ViewModels.

Темы демонстрационного примера Лекции 10:

  • .sheet
  • .popover
  • TextField
  • Form
  • Больше об “Ограничениях и Выгодах” (Constraints and Gains) через улучшение Grid.
  • Удаление с экрана модально представленных Views через @Binding.
  • Множество MVVM в одном приложении.
  • Hashable и Equatable
  • NavigationView + NavigationLink + .navigationBarTitle / Items
  • Alerts
  • Уничтожение в ForEach с помощью .onDelete
  • EditButton
  • EditMode @Environment переменная (@Binding)
  • Установка @Environment переменных 
  • .zIndex

Читать далее

Лекция 9 CS193P Spring 2020 — Поток данных (Data Flow).

На Лекции 9 курса Стэнфорда  CS193p — «Developing  Application for iOS» («Разработка приложений для iOS») Пол Хэгерти рассматривает супер важную тему — Property Wrappers (“Обертки Свойства”). Мы наконец-то поймем, что такие вещи, как @State и @Published, делают “под капотом”. Далее профессор слегка затрагивает тему “издателей” Publishers, потому что если мы начинаем говорить о @Published, то быстро приходим к этой очень важной теме, однако на этой Лекции 9 дается лишь некоторый обзор на эту тему, более подробно эта тема будет обсуждаться позже. 

Затем мы погружаемся в демонстрационный пример, в котором профессор показывает нам где, когда и как используются “издатели” Publishers, а также говорит о @Binding, который является новой для нас Property Wrapper (“Оберткой Свойства”). Сочетание этих двух механизмов позволяет нам ссылаться на «единственный источник истины» (source of truth) для данных, а не требовать их копирования, что может быть подвержено ошибкам.

Читать далее

Лекция 8 CS193P Spring 2020 — Жесты JSON.

На Лекции 8 курса Стэнфорда  CS193p — «Developing  Application for iOS» («Разработка приложений для iOS») вначале на слайдах, а затем в демонстрационном примере, рассматривается одна короткая тема:  легковесное постоянное хранилище (persistent store) UserDefaults, и одна большая главная тема  — жесты Gestures, как источник ввода информации пользователем с помощью его пальцев. Далее следует большой демонстрационный пример, в котором обеспечивается превращение Модели EmojiArt документа в JSON и хранения его в UserDefaults. Но главные усилия в этом демонстрационном примере направлены на реализацию жеста pinch, с помощью которого можно масштабировать  EmojiArt документа, и жеста pan, с помощью которого можно перемещать EmojiArt документ по экрану. Это НЕ-дискретные жесты, и в SwiftUI есть специальная технология, основанная на использовании @GestureState переменных и пары модификаторов жестов .updating и .onEnded, которую профессор и демонстрирует. По ходу демонстрации профессор также показывает ряд других крутых вещей наподобие анимированных шрифтов.

Читать далее