Новый стэнфордский курс CS193P «Разработка iOS приложений с использованием SwiftUI» Весна 2020г. начали выкладывать.

Стэнфордский курс CS193p — «Developing  Application for iOS using SwiftUI.» («Разработка приложений для iOS с применением SwiftUI.»),  прочитанный в весеннем семестре 2020 года (Spring 2020)  студентам Стэнфорда в формате on-line из-за новой пандемии коронавируса, начали  выкладывая по две Лекции в неделю. Следите за этим здесь.

 

Ожидается новый стэнфордский курс CS193P Весна 2020, но несколько позже.

Пол Хэгерти 30 марта 2020 года начал читать свой новый курс CS193P Весна 2020. Во всем мире, конечно, интересуются, будет ли он выложен в открытом доступе, что Стэнфорд делал практически всегда на протяжении 10 лет. В ответ на многочисленные просьбы, Пол Хэгерти выложил в своем уже порядком застоявшемся блоге сообщение, которое я здесь привожу в переводе на русский язык.

«Для не стэнфордских студентов. Тем, кто следит за обновлением курса CS193P. 
Что касается обновления курса CS193P Весна 2020 года, то я хочу вам сообщить следующее.

Многие из вас, вероятно, знают, что Стэнфордский университет в этом квартале в рамках всемирных усилий по замедлению распространения нового коронавируса предоставляет для своих студентов все свои курсы в режиме онлайн. Хотя может показаться, что это даёт нам прекрасную возможность сделать курс доступным онлайн для просмотра всеми, кто не является студентами Стэнфорда, надо понимать, что это сделать непросто и причина заключается в том, что ресурсы в Стэнфорде, которые делают курсы доступными в Интернете, ограничены. Понятно, что они полностью исчерпаны в данный момент, когда мы пытаемся сделать так много курсов ( а на самом деле ВСЕ) доступными онлайн для своих студентов.

Поэтому, хотя мы искренне хотим опубликовать CS193P за пределами Стэнфорда в этом квартале, в настоящее время вопрос заключается в том, сможем ли мы (и / или когда) сделать это. Оставайтесь с нами, и если что-то изменится, мы дадим вам знать.

Курс CS193P Стэнфордского университета «Разработка приложений для iOS» осень 2017-18 (на основе iOS 11 и Swift 4) доступна для iPhones и iPads на iTunesU. Или вы можете посмотреть его на своем Mac в приложении Podcast здесь

Надо сказать, что в данный момент, когда Apple на своей последней конференции разработчиков WWDC 2019 предоставил так много всяких новых возможностей и по разработке UI (SwiftUI), и по взаимодействию  с интернетом (Combine), и отдельную операционную систему iPadOS, и инструмент Mac Catalyst, а Swift 5 сильно усложнился за счет дополнительных «фишек» типа «обёртки свойств» @propertyWrapper, «непрозрачного ТИПА» Opaque Types, атрибута @dynamicCallable и т.д., хотелось бы, чтобы Пол Хэгерти всё расставил на свои места, как он это умеет. Обычно он берет все самое передовое. Интересно, будет ли SwiftUI в Лекциях?

Так что будем ждать. Я думаю, что как только в июле ( а может быть раньше) закончится учебный процесс, у нас есть шанс получить CS193P online.

А пока вы можете получить на этом сайте доступ к русскоязычным конспектам упомянутого в обращении профессора Стэнфордский курса«Developing  iOS 11 Apps with Swift», адаптированного к iOS 12 и Swift 4.

MVVM на основе Combine в UIKit и SwiftUI приложениях для UIKit разработчиков..

Мы знаем, что ObservableObject классы с его @Published свойствами созданы в Combine специально для View Model в SwiftUI. Но в точности ту же самую View Model можно использовать и в UIKit для реализации архитектуры  MVVM, хотя  в этом случае нам придется вручную «привязать» (bind) UI элементы к @Published свойствам View Model. Вы удивитесь, но с помощью Combine это делается парой строк кода. Кроме того, придерживаясь этой идеологии при проектировании UIKit приложений, вы в дальнейшем безболезненно перейдете на SwiftUI.

Цель этой статьи  состоит в том, чтобы на примитивно простом примере показать, как можно элегантно реализовать MVVM архитектуру в UIKit с помощью Combine. Для контраста покажем использование той же самой View Model в SwiftUI.

Мы создадим два простейших приложения, позволяющих выбирать с сайта OpenWeatherMap самую свежую информацию о погоде для определенного города. Но UI одного из них будет создан с применением SwiftUI,  а другого — с помощью UIKit. Для пользователя эти приложения будут выглядеть почти одинаковыми. Код находится на Github.

Пользовательский интерфейс (UI) будет содержать всего 2 UI элемента: текстовое поле для ввода города и метку для отображения температуры. Текстовое поле для ввода города — это активный ВХОД (Input), а отображающая температуру метка — пассивный ВЫХОД (Output).  

Роль View Model в архитектуре MVVM состоит в том, что она берет ВХОД(Ы) с View (или ViewController в UIKit), реализует бизнес-логику приложения и передаёт ВЫХОДЫ назад в View (или ViewController в UIKit), возможно, представляя эти данные в нужном формате.

Создать View Model с помощью Combine независимо от того, какая бизнес-логика — синхронная или асинхронная — очень просто, если использовать ObservableObject класс с его @Published свойствами.

Читать далее

Современный код для выполнения HTTP запросов в Swift 5 с помощью Combine и применение их в SwiftUI. Часть 3. Новости Hacker News.

Hacker News, чей API мы собираемся использовать в этой статье, является социальным сайтом, сфокусированным на компьютерах и предпринимательстве. Если вы с ним ещё не знакомы, то вы найдёте там много интересного.

В предыдущих статьях  на примере базы данных фильмов TMDb и агрегатора новостей NewsAPI.org была представлена стратегия применения Combine для формирования HTTP запросов и использования их во View Model для управления UI, спроектированного с помощью SwiftUI. В этой статье мы в точности воспроизведем ту же самую стратегию для разработки приложения, взаимодействующего с агрегатором новостей Hacker News, но добавим работу с «внешним» издателем Timer и для простоты исключим обработку ошибок.

Надо сказать, что выборка статей на ресурсе Hacker News имеет совершенно другую логику, чем в новостном агрегаторе NewsAPI.org, но технология, основанная на выполнении HTTP запросов с помощью Combine, прекрасно показывает свою гибкость и в этой ситуации. Кроме того, информация там очень часто обновляется и использование внешнего «издателя» Timer в View Model для изменения UI в SwiftUI позволит автоматически отслеживать поступающие на сайт новые истории (Story), именно так их называют на этом ресурсе.

API агрегатора новостей Hacker News можно использовать совершенно свободно и не требуется никакой регистрации для аккаунта разработчика. Это здорово, потому что вы можете сразу начать работать над кодом без длительной регистрации, как мы делали это с другими public APIs

Наша стратегия состоит в том, что мы создаём с помощью Combine «издателей» Publisher для выборки данных из интернета, на которые затем «подписываемся» в ObservableObject классах с @Published свойствами, изменения которых SwiftUI АВТОМАТИЧЕСКИ отслеживает и полностью «перерисовывает» свои View.

В эти ObservableObject классы мы закладываем определенную бизнес-логику приложения, пользуясь тем, что некоторые из этих  @Published свойств могут напрямую меняться либо такими «активными» элементами пользовательского интерфейса (UI) как текстовые поля TextField, Picker, Stepper, Toggle , либо с помощью внешних «издателей» типа Timer, а другие @Published  свойства, напротив, могут быть «пассивными», являясь результатом синхронных и/ или асинхронных преобразований «активных» @Published свойств, но именно они то нас чаще всего и интересуют. Зависимость «пассивных» от «активных» @Published свойств очень просто описываем с помощью Combine в ObservableObject классах, которые  выступают в роли View Model для управления UI в SwiftUI

Отличительной особенностью приложения, представленное в этой статье, является то, что обновление новостного контента будет происходить АВТОМАТИЧЕСКИ без участия пользователя, благодаря внешнему «издателю» Timer. Для того, чтобы сосредоточиться исключительно на этом, UI приложения будет максимально упрощен: он не будет содержать никаких «картинок» (images), кроме того не будет возможности детального исследования историй. Зато время, прошедшее с момента появления истории на сайте Hacker News, будет постоянно обновляться. Поступление каждой новой истории будет оперативно отражаться на UI и сопровождаться звуковым сигналом.

Читать далее

Современный код для выполнения HTTP запросов в Swift 5 с помощью Combine и применение их в SwiftUI. Часть 2. Новости NewsAPI.org.

Приложение для взаимодействия с агрегатором новостей NewsAPI.org.

В предыдущей статье  на примере базы данных фильмов TMDb была представлена стратегия применения Combine для формирования HTTP запросов и использования их во View Model для управления UI, спроектированного с помощью SwiftUI. В этой статье мы в точности воспроизведем ту же самую стратегию для разработки приложения, взаимодействующего с агрегатором новостей NewsAPI.org.

Но в отличии от базы данных фильмов  TMDb, которая идеально  спроектирована и очень аккуратно поддерживается, агрегатор оперативных новостей  NewsAPI.org  наполняется разными информационными агенствами, а они, например, могут по-разному кодировать отсутствие «КАРТИНКИ» (image) для своих статей, или предоставлять её только для private доступа. Поэтому вы указываете отличную от nil ссылку на «КАРТИНКУ» (image), а она вовсе необязательно появится на экране, вы можете получить сообщение о её недоступности. Кроме того, при обращении к серверу NewsAPI.org могут возникать ошибки, например, связанные с тем, что вы задали неправильный ключ API-key или превысили допустимое количество запросов, обусловленное вашим тарифом. Необходимо обрабатывать такого рода ошибки сервера. Иначе пользователь вашего приложения попадёт в ситуацию, когда вдруг ни с того, ни с сего, сервер NewsAPI.org перестанет обрабатывать какие-либо запросы, оставляя пользователя в полном недоумении с пустым экраном.

Следовательно, надо уметь не только выбирать с помощью Combine данные из интернета, но и обрабатывать сообщения об ошибках. В этой статье мы покажем, как обработка ошибок в Combine при выборке данных позволила построить информативный UI в SwiftUI.

Читать далее

Современный код для выполнения HTTP запросов в Swift 5 с помощью Combine и применение его в SwiftUI. Часть 1. База данных фильмов.

Выполнение HTTP запросов — это один из самых важных навыков, которые необходимо получить при изучении iOS. В более ранних версиях Swift ( до версии 5) вне зависимости от того, формировали ли вы эти запросы «с нуля» или с использование известного фреймворка Alamofire,  вы в конечном итоге получали сложный и запутанный код с callback типа completionHandler: @escaping(Result<T, APIError>) -> Void.

Появление в Swift 5 нового фреймворка функционального реактивного программирования Combine в сочетании с уже существующими URLSession и Codable предоставляет вам все необходимые инструменты для самостоятельного написания очень компактного кода для выборки данных из интернета.

Мы будем создавать «издателей» Publisher для выборки данных из интернета, на которые в дальнейшем можно будет легко «подписаться» и использовать при проектировании UI как с помощью UIKit, так и с помощью SwiftUI.

В SwiftUI это выглядит более эффектно, если не сказать «фантастически», так как разделение данных и View в SwiftUI осуществляется с помощью ObservableObject классов с @Published свойствами, изменения которых SwiftUI АВТОМАТИЧЕСКИ отслеживает и полностью «перерисовывает» View. В эти ObservableObject классы можно заложить определенную бизнес-логику приложения, так как некоторые из этих  @Published свойств могут напрямую меняться такими «активными» элементами пользовательского интерфейса (UI) как текстовые поля TextField, Picker, Stepper, Toggle и т.д. Другие @Published свойства, напротив, могут быть «пассивными», являясь результатом синхронных и/ или асинхронных преобразований «активных» @Published свойств, но именно они то нас чаще всего и интересуют. Они обычно воспроизводятся в SwiftUI такими пассивными  (UI) элементами, как текст Text, изображение Image, геометрические фигуры и т.д. Зависимость «пассивных» @Published свойств от «активных» @Published свойств очень просто описать с помощью Combine.

Чтобы было понятно, о чём идет речь, приведу конкретные примеры. Сейчас многие сервисы типа базы данных фильмов TMDb или агрегаторов новостей NewsAPI.org и Hacker News предлагают пользователям выбирать различные коллекции фильмов или наборы статей в зависимости от того, что вас интересует. В случае базы данных фильмов  TMDb это могут быть фильмы, которые идут в данный момент в кинотеатрах, или популярные фильмы, или топовые фильмы,  или фильмы, которые скоро появятся на экране. В случае  агрегаторов новостей NewsAPI.org и Hacker News это могут быть последние новости, или новости в какой-нибудь категории — «спорт», «здоровье», «наука», «технологии», «бизнес», или новости от определенного информационного источника «CNN», «ABC news», «Bloomberg» и т.д., или новости, удовлетворяющие какому-то произвольному критерию. Свои желания для сервисов вы обычно «высказывает» в виде Endpoint, который формирует для вас нужный URL.

Так вот, используя фреймворк Combine, вы можете в ObservableObject классах с помощью очень компактного кода (в большинстве случаев не более 10-12 строк) однократно сформировать синхронную и/или асинхронную зависимость списка фильмов или статей (как «пассивных» @Published свойств) от Endpoint (как «активных» @Published свойств) в виде «подписки», которая будет действовать на протяжении всего «жизненного цикла» экземпляра ObservableObject класса. А далее в SwiftUI управлять только тем, что вы хотите увидеть, то есть выбирать нужную вам Endpoint: то ли это будут популярные фильмы, или фильмы, идущие в данный момент на экране,  то ли это будут статьи с последними новостями или статьи в разделе «здоровье». Появление соответствующих фильмов или статей на вашем UI будет обеспечиваться АВТОМАТИЧЕСКИ этими ObservableObject классами и их пассивными @Published свойствами.  В коде SwiftUI у вас никогда не возникнет необходимости  явно запрашивать выборку фильмов или статей, вы будете управлять только тем, ЧТО вы хотите увидеть через Endpoint, вовсе не заботясь о результате, ибо он ВСЕГДА будет правильным и синхронным благодаря работе ObservableObject классов, которые исполняют роль View Model.

Я на трех конкретных примерах покажу, как это работает с помощью применения Combine для формирования HTTP запросов к различным сервисам и использование их в качестве View Model в SwiftUI.

Начнем с разработки приложения для взаимодействия с базой данных фильмов TMDb, а в последующем — приложений для взаимодействия с агрегаторами новостей NewsAPI.org и Hacker News. Во всех трех случаях будет действовать примерно одна и та же схема использования Combine , ибо в приложениях такого рода всегда приходится формировать СПИСКИ фильмов или статей, выбирать сопровождающие их «КАРТИНКИ» (images), ИСКАТЬ в базах данных нужные фильмы или статьи с помощью поисковой строки.

При обращении к сервисам типа базы данных фильмов TMDb или агрегаторов новостей NewsAPI.org и Hacker News могут возникать ошибки, например, связанные с тем, что вы задали неправильный ключ API-key или превысили допустимое количество запросов или еще что-то. Необходимо обрабатывать такого рода ошибки сервиса. Иначе пользователь вашего приложения попадёт в ситуацию, когда вдруг ни с того, ни с сего перестанут обрабатываться какие-либо запросы, оставляя пользователя в полном недоумении с пустым экраном.  Поэтому надо уметь не только выбирать с помощью Combine данные из интернета , но и сообщать об ошибках, которые могут возникнуть при выборке. В этой статье мы уделим внимание обработке ошибок такого рода в Combine.

Читать далее

API для удаленной асинхронной выборки с помощью Apple Combine.

Combine — это функционально реактивный Swift фреймворк, который недавно реализован для всех платформ Apple, включая Xcode 11. С помощью Сombine очень легко обрабатывать последовательности значений values во времени. Он также позволяет упростить асинхронный код, отказавшись от делегирования и сложных вложенных callbacks.

Но изучение самого фреймворка Сombine на первых порах может показаться не таким уж простым. Дело в том, что основными «игроками» Сombine являются такие абстрактные понятия как «издатели» Publishers, «подписчики» Subscribers и операторы Operators. Есть, конечно, и другие, но без понимания этих 3-х не удастся много достигнуть в понимании логики функционирования Combine. Поэтому статья начинается с очень краткого обзора этих основных понятий. А далее нас ждет приятный сюрприз от Apple. Большинство»издателей» Publishers, «подписчиков» Subscribers и операторов Operators либо уже реализованы в самом Combine, либо они добавлены к уже существующим классам UISession, Timer, NotificationCenter, CoreData. И это существенно облегчает написание кода, который оказывается очень компактным и хорошо читаемым. Вы увидите это на примере приложения, связанного с асинхронной выборкой информации о фильмах из очень популярной сейчас базы данных TMDb. Мы создадим  два различных приложения: UIKit и SwiftUI, и покажем, как с ними работает Combine.

Надеюсь, эта статья облегчит Вам изучение Сombine.

Код для всех приложений, разработанных в этой статье, можно найти на Github.

Читать далее

SwiftUI & Combine: Вместе лучше.

Это перевод статьи «SwiftUI & Combine: Better Together», в которой на очень простом примере и очень подробно показано, как можно использовать новый фреймворк Combine в содружестве со SwiftUI с целью эффективного создавать приложений с помощью функционального реактивного программирования (Functional Reactive Programming — FRP) .

Одно из самых значимых объявлений, сделанных Apple на конференции разработчиков WWDC 2019, был SwiftUI — его декларативный подход позволяет создавать пользовательские интерфейсы (UI) очень быстро, так что не удивительно, почему разработчики так воодушевлены этим. Однако скрытой жемчужиной WWDC 2019 был фреймворк Combine, который не получил столько фанфар, но я думаю, что он бы это заслужил.

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

Читать далее

SwiftUI для конкурсного задания Telegram Charts (март 2019 года). Часть 2.

Это вторая часть поста, посвященного использованию SwiftUI для решения предыдущего конкурса Telegram Charts (март 2019).

Первая часть, в которой сформулирована сама задача и описаны отдельные элементы UI для отображения одного «набора Графиков»,  представлена здесь. В этом посте мы займемся комбинированием этих частей сначала для создания ChartView для одного «набора Графиков», а затем для комбинации различных ChartView для множества «набора Графиков».

Комбинирование различных Views

SwiftUI — это прежде всего комбинирование различных маленьких Views в большие, а больших Views — в очень большие и т.д., как в игре Lego. В SwiftUI есть множество средств такого комбинирования Views:

  • вертикальный стек VStack,
  • горизонтальный стек HStack,
  • «глубинный» стек ZStack,
  • группа Group,
  • ScrollView,
  • список List,
  • форма Form,
  • контейнер с «закладками» TabView
  • и т.д.

Начнем наше комбинирование с самого простейшего GraphsViewForChart, который наделяет «безликий» «набор Графиков» GraphsForChart осью Y и индикатором, перемещающимся по оси X, с помощью «глубинного» стек ZStack: Читать далее

SwiftUI для конкурсного задания Telegram Charts (март 2019 года). Часть 1.

Сразу начну с замечания о том, что приложение, о котором пойдет речь в этой статье, требует Xcode 11 и MacOS Catalina (в настоящий момент последняя находятся в Beta 9). Код приложения находится на Github.

В этом году на WWDC 2019, Apple анонсировала SwiftUI, новый способ построения пользовательского интерфейса (UI) на всех устройствах Apple. Это практически полное отступление от привычного нам UIKit, и я — как и многие другие iOS разработчики — очень хотела посмотреть этот новый инструмент в действии.

Очень много было написано о SwifUI за последние три месяца, начиная с Xcode 11 beta 1 и до  нынешней версии Xcode 11.0. Этот пост вовсе не имеет целью дать какое-то масштабное введение в SwiftUI. Это просто опыт решение некоторой задачи, которую не удается в рамках UIKit удовлетворительно решить (представить код в читабельном виде).

Задача связана с конкурсом, объявленным Telegram для Android, iOS and JS разработчиков, который  проходил в период 10 — 24 марта 2019 года.  В этом конкурсе была предложена простая задача графического отображения интенсивности использования некоторого ресурса в интернете от времени на основе JSON данных.

Читать далее