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

Введение

Всем привет и добро пожаловать на курс CS193P Стэнфордского университета. Это курс о разработке приложений для таких устройств iOS, как iPhone и iPad, с использованием среды разработки под названием SwiftUI Это повтор курса, изначально предложенного моим студентам в весеннем семестре 2020 года. Меня зовут Пол Хэгарти. Я учил разработке приложений для iOS студентов Стэнфорда, конечно, в той или иной форме, около 10 лет, и я знаю, что вы приходите к этому изучению с очень разным бэкграундом, опытом программирования и разными ожиданиями того, что вы можете получить от этого курса. Так что на этот раз я решил сделать это небольшое вступление для студентов не из Стэнфорда, чтобы попытаться дать вам представление о том, чего ожидать от этого курса, прежде чем вы погрузитесь в него.  Этот семестр был очередным пандемическим семестром, предлагающим только удаленное обучение, так что вы получите этот курс точно в таком же виде, как мои стэнфордские студенты, на видео, и определенно в этом есть недостатки. Я люблю живые лекции, но на данный момент не могу этого делать, но есть некоторые преимущества и при просмотре лекций на видео. Например, у вас есть возможность сделать паузу и перемотать видео назад. Это отличная возможность, если у вас курс с таким техническим содержанием, как наш курс.

Конечно, у студентов Стэнфорда были супер интерактивные форумы этого курса и куча ассистентов профессора (ТА), готовых в любой момент им помочь, а вы будете этого лишены, но есть огромное множество действительно отличные ресурсов в Интернете. Есть очень яркое сообщество SwiftUI. И это не единственное место, где можно изучить программирование на iOS. Так что вам определенно следует найти все эти ресурсы и посмотреть эти видео, если вы уже этого не сделали. Этот курс проходит в своего рода «нарративном» формате, что хорошо работает для студентов, потому что они увязывают материал этого курса с другими своими курсами. Итак, мы работаем вместе, студенты и я. В процессе прохождения курса мы создадим пару прекрасных приложений, карточную игру и приложение для рисования. Я рассказываю лишь часть истории, когда я читаю Лекции и показываю демонстрационные примеры, а они участвуют в продолжении этой истории, когда делают свои домашние задания. Их домашние задания всегда строят на том, что я делаю на Лекции. Именно поэтому мы публикуем все описания домашних заданий и весь демонстрационный код на сайте cs193p.stanford.edu. Обязательно поищите их. Они абсолютно необходимы для получения максимальной отдачи от этого курса.

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

Немного о предварительных требованиях к этому курсу. Студентам Стэнфорда рекомендовано взять хотя бы три, а на самом деле четыре вводных CS (Computer Science — Информатика) курса, так что они приходят на мой курс CS193P уже опытными программистами. В частности, одна из вещей, которую знают все студенты Стэнфорда, когда берут курс CS193P, это объектно-ориентированное программирование. Хотя на самом деле программирование с использованием SwiftUI не требует уж очень обширного применения объектно-ориентированное программирования, но концепции, которые вы изучаете в объектно-ориентированном программировании, такие, как экземпляры структур данных и инкапсуляция, действительно хорошие вещи, которые нужно знать, когда пытаешься понять, как работает SwiftUI. Кроме того, SwiftUI требует от вас изучения нового язык программирования под названием Swift. У стэнфордских студентов, которые берут курс CS193P, уже трижды или четырежды был опыт изучения нового языка программирования, так что для них изучение нового языка программирования не требует больших усилий. Но если для вас Swift будет вашим вторым языком программирования или вы — вообще начинающий программист и это ваш первый язык программирования, то вам понадобятся значительные дополнительные усилия, чтобы усвоить весь материал этого курса.

Из всего этого можно сделать вывод, что этот  курс не предназначен для начинающих программистов. Однако, если вы только начинаете программировать или вообще не являетесь программистом, то вам будет очень интересно посмотреть Лекции первых 2-х недель, чтобы составить представление о том, на что это похожа разработка приложения для iOS, потому что мы сразу приступаем к работе.

Студенты Стэнфорда отдельно не изучают язык программирования Swift, поэтому мы с самого начала не предполагаем, что они что-нибудь знают о Swift. Мы будем проходить его шаг за шагом и призываем студентов следовать за нами. Домашние задания действительно требует, чтобы вы следовали этим шагам. Независимо от вашего уровня и опыта программирования, вы должны повторять все то, что мы делали на Лекции,  по крайней мере, на первых нескольких Лекциях. 

Но затем … вы должны решить, куда вы хотите пойти дальше. Надеюсь, я дал вам всю информацию, которая требуется, чтобы начать.

Итак, поехали.

Читать далее

Стэнфордский курс 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) для данных, а не требовать их копирования, что может быть подвержено ошибкам.

Читать далее