Одним из заметных событий WWDC 2023 для разработчиков, программируемых на языке Swift, стало появление фреймворка SwiftData. В этой статье показано, как создать Схему данных в SwiftData
, как выполнить CRUD операции (Create - Создать, Read - прочитать, Update - модифицировать, Delete - удалить), как выполнять запросы Query
к данным с помощью предиката Predicate
, как использовать "живой" запрос @Queryв SwiftUI и как его динамически настроить. Вы узнаете, как эффективно "закачивать" JSON
данные в SwiftData
хранилище без блокировки пользовательского интерфейса (UI).
User
Как превратить единственный SwiftUI контейнер в dropDestination для нескольких Transferable типов?
Новый протокол Transferable
пришел на замену классу NSItemProvider
в iOS 16+, macOS 13+ (Ventura и новее), watchOS 9.0+ и tvOS 16+. Познакомиться с некоторыми аспектами применения протокола Transferable можно в постах Протокол Transferable меняет правила игры для Drag & Drop в SwiftUI и Протокол Transferable в SwiftUI — передача альтернативного контента с помощью ProxyRepresentation.
Проблема в том, что при использовании нового протокола Transferable
и нового View
модификатора .dropDestination (for: action: isTargeted:);
его параметр for
не принимает несколько ТИПов "сбрасываемых" объектов одновременно, как это делает выше приведенный View
модификатор .onDrop (of: [.plainText, .url, .image] ...).
С помощью перечисления enum
DropItem
, куда мы включили все возможные объекты (текст String
, URL
-адрес, изображение в виде двоичного файла Data
), нам удалось в SwiftUI
с помощью нового протокола Transferable
обеспечить перетаскивание и "сброс" (Drag & Drop) в один и тот же контейнер (например,ZStack
) различных ТИПов объектов.
Core Data в современном интерьере SwftUI. Взаимосвязь объектов. Динамический @FetchRequest. часть 2
Core Data
в SwiftUI
на примере шаблонного приложения, предложенное Apple. Это было тривиальное приложение, в котором всего лишь один объект Core Data
с одним единственным атрибутом, и тем не менее было показано, что давая объектам Core Data
дополнительную функциональность с помощью „синтаксического сахара“ в расширении extension
их классов class
, автоматически генерируемых Xcode
, можно добиться комфортной работы с Core Data
в SwiftUI
. Эти классы являются миниатюрными ViewModels
для наших SwiftUI Views
, так как они реализуют протоколы ObservableObject
и Identifiable
. И Apple
научила их прекрасно «играть» на поле реактивности SwiftUI. Во второй части статьи я хочу показать, что роль автоматически генерируемых
Xcode
классов class
для объектов Core Data
существенно возрастает при работе с реальными взаимосвязанными объектами — рейсами Flights
, аэропортами Airports
и авиакомпаниями AirLines
, которые мы получаем в интернете на сайте компании FlightAware и размещаем в локальной базе данных Core Data
. Создаваемое в этой части статьи приложение с именем
CoreDataSwiftUIFlights
является сильно упрощенной модификацией реального приложения Enroute из стэнфордских курсов CS193P 2020, которое оперативно подкачивает данные с сервера FlightAware и требует от вас платной подписки на сервис FlightAware . Однако, просто зарегистрировавшись на сайте компании FlightAware, вы можете бесплатно получить временной срез любой интересующей вас информации о рейсах
Flights
, аэропортах Airports
и авиакомпаниях Airlines
в JSON
формате. Эти данные размещаются в Core Data
с учетом взаимосвязей этих объектов, и вы можете не просто видеть всю информацию о рейсах, но и делать различные запросы к ней с помощью фильтров и сортировать ее нужным вам способом.Код находится на Github.
Core Data в современном интерьере SwiftUI. Некоторые уточнения и заблуждения. часть 1
Core Data
, разработанный Apple для постоянного хранения данных на своих платформах, эффективно работающий даже с очень большими объемами данных, используется очень давно, с версии iOS 3
и macOs 10.4
, так что прошло где-то порядка 10 лет с того момента, когда Apple впервые представила фреймворк Core Data
. Когда это произошло, языка программирования Swift
вообще не было в проекте, так что Core Data
была спроектирована с ориентацией на Objective-C
и, конечно, это отразилось на её API
.Но на WWDC 2019 был впервые представлен
SwiftUI
, который предложил нам новую парадигму конструирования UI
, он был предложен для iOS 13
и полностью опирался на Swift
, его корни — это Swift
, хотя он использует UIKit
“под капотом” и полностью зависит от UIKit
на iOS
, по крайней мере на данный момент, и от AppKit
на macOS
. Конечно, он это скрывает, как только может, он сконструирован и реализован с прицелом на Swift
. Более того, Swift
сам был существенно доработан с целью поддержки SwiftUI
и стал ещё более мощным и интересным.Но дело даже не в возрастном различии фреймворков, a в том, что
Core Data
принципиально связана с объектно-ориентированным программированием ( классы, наследование, делегирование и все такое), a суперсовременный SwiftUI
основан на декларативном функциональном программировании (структуры, протокольно-ориентированное программирование) и имеет реактивную природу, которая воплощается в использовании архитектуры MVVM
. Впечатление от Стэнфордских курсов CS193P Весна 2020 г.: Разработка iOS приложений с помощью SwiftUI
Стэнфордский университет, США — один из лучших в мире в области информатики (Computer Science). Он щедро делится своими курсами, и одним из самых популярных и успешных курсов является курс
CS193P
по разработке приложений на iOS
, который читает профессор Пол Хэгерти. Предложенные в весеннем семестре 2020 года лекции Стэнфордского курса
CS193P
«Developing Application for iOS with SwiftUI» («Разработка приложений для iOS с использованием SwiftUI») были прочитаны студентам Стэнфорда с ориентацией на новый продукт, предоставленный Apple
разработчикам в 2019 г, — фреймворк SwiftUI
для разработки реактивного пользовательского интерфейса (UI). На сайте курса вы найдете материалы, которые были предоставлены студентам Стэнфорда в течение весеннего семестра 2020 г.: ссылки на видео, слайды, домашние задания и код демонстрационных примеров. Русскоязычный конспект курса представлен здесь.SwiftUI
— это совершенно новая вещь, которой было всего несколько месяцев от роду на момент прочтения лекций. Но это самый передовой край технологий, которые, наконец, добрались до разработки приложений на iOS
. В июне 2020 г. состоялась международная конференция разработчиков Apple WWDC
и там была представлена следующая версия SwiftUI 2.0
. Изменения в версии SwiftUI 2.0
отражены на сайте курса на закладке WWDC
.MVVM на основе Combine в UIKit и SwiftUI приложениях для UIKit разработчиков
Мы знаем, что
ObservableObjec
t классы с его @Published
свойствами созданы в Combine
специально для View Model
в SwiftUI
. Но в точности ту же самую View Model
можно использовать и в UIKit
для реализации архитектуры MVVM
, хотя в этом случае нам придется вручную «привязать» (bind
) UI
элементы к @Published
свойствам View Mode
l. Вы удивитесь, но с помощью Combine
это делается парой строк кода. Кроме того, придерживаясь этой идеологии при проектировании UIKit
приложений, вы в дальнейшем безболезненно перейдете на SwiftUI
.Цель этой статьи состоит в том, чтобы на примитивно простом примере показать, как можно элегантно реализовать
MVVM
архитектуру в UIKit
с помощью Combine
. Для контраста покажем использование той же самой View Model
в SwiftUI
.В статье будут рассмотрены два простейших приложения, позволяющих выбирать с сайта OpenWeatherMap самую свежую информацию о погоде для определенного города. Но
UI
одного из них будет создан с применением SwiftUI
, а другого — с помощью UIKit
. Для пользователя эти приложения будут выглядеть почти одинаковыми. Код находится на Github.
Современный код для выполнения HTTP запросов в Swift 5 с помощью Combine и применение их в SwiftUI. Часть 2. Hacker News
Hacker News, чей
API
мы собираемся использовать в этой статье, является социальным сайтом, сфокусированным на компьютерах и предпринимательстве. Если вы с ним ещё не знакомы, вы найдёте там много интересного.В предыдущих статьях на примере базы данных фильмов TMDb и агрегатора новостей NewsAPI.org была представлена стратегия применения
Combine
для формирования HTTP
запросов и использования их во View Model
для управления UI
, спроектированного с помощью SwiftUI
. В этой статье мы в точности воспроизведем ту же самую стратегию для разработки приложения, взаимодействующего с агрегатором новостей Hacker News, но добавим работу с «внешним» издателем Timer
и для простоты исключим обработку ошибок.Надо сказать, что выборка статей на ресурсе Hacker News имеет совершенно другую логику, чем в новостном агрегаторе NewsAPI.org, но технология, основанная на выполнении
HTTP
запросов с помощью Combine
, прекрасно показывает свою гибкость и в этой ситуации. Кроме того, информация на сайте Hacker News очень часто обновляется и использование внешнего «издателя» Timer
позволит автоматически отслеживать поступающие на сайт новые истории (Story
), именно так их называют на этом ресурсе.API
агрегатора новостей Hacker News можно использовать совершенно свободно и не требуется никакой регистрации для аккаунта разработчика. Это здорово, потому что вы можете сразу начать работать над кодом без длительной регистрации, как мы делали это с другими public APIs
. Современный код для выполнения HTTP запросов в Swift 5 с помощью Combine и применение их в SwiftUI. Часть 1
Выполнение
HTTP
запросов — это один из самых важных навыков, которые необходимо получить при разработке iOS
приложений. В более ранних версиях Swift
(до версии 5) вне зависимости от того, формировали ли вы эти запросы «с нуля» или с использование известного фреймворка Alamofire, вы в конечном итоге получали сложный и запутанный код с callback
типа completionHandler: @escaping(Result<T, APIError>) -> Void
.Появление в
Swift 5
нового фреймворка функционального реактивного программирования Combine
в сочетании с уже существующими URLSession
и Codable
предоставляет вам все необходимые инструменты для самостоятельного написания очень компактного кода для выборки данных из интернета.В этой статье в соответствии с концепцией
Combine
мы будем создавать «издателей» Publisher
для выборки данных из интернета, на которые в дальнейшем сможем легко «подписаться» и использовать при проектировании UI
как с помощью UIKit
, так и с помощью SwiftUI
.В
SwiftUI
это выглядит более лаконично и более эффектно, так как действие «издателей» Publisher
не ограничивается просто выборкой данных, а простирается дальше, вплоть до управления пользовательским интерфейсом (UI
). Дело в том, что в SwiftUI
разделение данных и View
осуществляется с помощью ObservableObject
классов с @Published
свойствами, изменения которых SwiftUI
АВТОМАТИЧЕСКИ отслеживает и полностью «перерисовывает» свои View
. В эти
ObservableObject
классы можно очень просто заложить определенную бизнес-логику приложения, если некоторые из этих @Published
свойств являются результатом синхронных и/ или асинхронных преобразований других @Published
свойств, которые можно напрямую менять такими «активными» элементами пользовательского интерфейса (UI
) как текстовые поля TextField
, Picker
, Stepper
, Toggle
и т.д. API для удаленной асинхронной выборки с помощью Apple Combine
Combine — это функциональный реактивный
Swift
фреймворк, который недавно реализован для всех платформ Apple
, включая Xcode 11
. С помощью Combine очень легко обрабатывать последовательности асинхронно появляющихся во времени значений values. Он также позволяет упростить асинхронный код, отказавшись от делегирования и сложных вложенных callbacks.Но изучение самого фреймворка Combine на первых порах может показаться не таким уж простым. Дело в том, что основными «игроками» Combine являются такие абстрактные понятия, как «издатели» Publishers, «подписчики» Subscribers и операторы Operators, без которых не удастся продвинуться в понимании логики функционирования Combine. Однако благодаря тому, что
Apple
предоставляет разработчикам уже готовых «издателей», «подписчиков» и операторов, код, написанный с помощью Combine, оказывается очень компактным и хорошо читаемым. Вы увидите это на примере приложения, связанного с асинхронной выборкой информации о фильмах из очень популярной сейчас базы данных TMDb. Мы создадим два различных приложения: UIKit и SwiftUI, и покажем, как с ними работает Combine.
SwiftUI для прошлого конкурсного задания Telegram Charts (март 2019 года): все просто
Сразу начну с замечания о том, что приложение, о котором пойдет речь в этой статье, требует Xcode 11 и MacOS Catalina , если вы хотите использовать
Live Previews
, и Mojave
, если будете пользоваться симулятором. Код приложения находится на Github.В этом году на WWDC 2019,
Apple
анонсировала SwiftUI
, новый декларативный способ построения пользовательского интерфейса (UI) на всех устройствах Apple
. Это практически полное отступление от привычного нам UIKit
, и я — как и многие другие разработчики — очень хотела посмотреть этот новый инструмент в действии.В этой статье представлен опыт решение с помощью
SwiftUI
некоторой задачи, код которой в рамках UIKit
несопоставимо более сложный и его не удается на мой взгляд представить в читабельном виде.Немного практики функционального программирования в Swift для начинающих
Я хотела бы представить концепцию Функционального Программирования новичкам самым простейшим образом, выделив некоторые его преимущества из множества остальных, которые реально позволят сделать код более читаемым и выразительным. Я подобрала для вас интересные демонстрационные примеры, которые находятся на
Playground
в Github.Функциональное Программирование: Определение
Прежде всего, Функциональное Программирование — это не язык или синтаксис, а скорее всего — способ решения проблем путем разбиения сложных процессов на более простые и последующей их композиции. Как следует из названия "Функциональное программирование", единицей композиции для данного подхода является функция; и цель такой функции — избежать изменения состояния или значений за пределами своей области действия (
scope)
.В Мире
Swift
для этого есть все условия, ибо функции здесь являются такими же полноправными участниками процесса программирования, как и объекты, а проблема изменяемости (mutation
) решается на уровне концепции value
ТИПОВ (структур struct
и перечислений enum
), которые помогают управлять изменяемостью (mutation
) и четко сообщают о том, как и когда это может произойти.Однако
Swift
не является в полном смысле языком Функционального программирования, он не принуждает вас к Функциональному программированию, хотя и признает преимущества Функциональных подходов и находит способы встраивания их. В этой статье мы сфокусируемся на использовании встроенных в
Swift
(то есть «из коробки») элементов Функционального программирования и понимании того, как можно их комфортно использовать в вашем приложении.Drag & Drop в ваших iOS приложениях
Механизм
Drag & Drop
, работающий в iOS 11
и iOS 12
, — это способ графического асинхронного копирования или перемещения данных как внутри одного приложения, так и между разными приложениями. Хотя этой технологии лет 30, она стала в буквальном смысле «прорывной» технологией на iOS
благодаря тому, что при перетаскивании чего-либо в iOS
, multitouch
позволяет свободно взаимодействовать с остальной частью системы и набирать данные для сброса из разных приложений.Concurrency в Swift 3 и 4. Operation и OperationQueue
Если вы хотите добиться
UI
отзывчивости вашего iOS
приложения, выполняя такие затратные по времени куски кода, как загрузка данных из сети или обработка изображений, то вам нужно использовать продвинутые паттерны, связанные с многопоточностью (сoncurrency
), иначе работа вашего пользовательского интерфейса (U
I) начнет сильно замедляться и даже может привести к полной его «заморозке». Вам нужно убрать ресурсо-затратные задачи с main thread
(главного потока), который отвечает за выполнение кода, отображающего ваш пользовательский интерфейс (UI
). В текущей версии
Swift 3
и ближайшей Swift 4
(осень 2017) это можно сделать двумя способами, которые пока не связаны с встроенными языковыми конструкциями Swift
, начало реализации которых будет только в Swift 5
(конец 2018).Один из них использует
GCD (Grand Central Dispatch)
и ему посвящена предыдущая статья. В этой статье мы покажем, как достичь отзывчивости UI
в iOS
приложениях с помощью таких абстрактных понятий, как операция Operation
и очередь операций OperationQueue
. Мы также покажем в чем различие этих двух подходов и какой из них в каких ситуациях лучше использовать.Код для этой статьи можно посмотреть на Github.
Стэнфордские курсы CS193P Зима 2017: Разработка iOS 10 приложений с помощью Swift
Стэнфордский университет, США — один из лучших в мире в области информатики (Computer Science). Он щедро делится своими курсами, и одним из самых популярных и успешных курсов является курс CS193P по разработке приложений на iOS, который читает профессор Пол Хэгерти. Это курс читается ежегодно, начиная с 2010 года. На данный момент актуальным является курс CS193P «Developing iOS 10 Apps with Swift», Зима 2017 года — «Разработка iOS 10 приложений с использованием Swift», и уже выложены все 17 Лекций и 5 Заданий на iTunes U (но можно смотреть и на Youtube).
В новом курсе отчетливо видно, что профессор сделал небольшой разворот всего курса от ОБЪЕКТНО-ОРИЕНТИРОВАННОГО программирования, к ФУНКЦИОНАЛЬНОМУ программированию с множеством неизменяемых объектов с APIs похожими на математические функции.
Конечно, iOS вовсе не была сконструирована на основе идеи функционального программирования. Но люди, которые изобретали Swift, держали “в голове” идею о функциональном программировании. Так что при разработке вашего iOS приложения (по крайней мере в части Модели) вы можете использовать множество элементов функционального программирования.
Это новый рубеж в iOS программировании, потому что в течение 10 лет люди, в основном, использовали в iOS программировании только reference type объекты, имея в виду концепцию объектно-ориентированного программирования. Но когда вы программируете на Swift с помощью структур
structs
и перечислений enums
, и особенно если вы подключаете механизмы протоколов protocols
и Generics
, то вы можете реально сделать прекрасную работу, имеющую дело с реальным функциональным программированием.Многопоточность (concurrency) в Swift 3. GCD и Dispatch Queues
Итак, у вас есть приложение, оно работает на
main thread
(главном потоке), который отвечает за выполнение кода, отображающего ваш пользовательский интерфейс (UI
). Как только вы начинаете добавлять к вашему приложению такие «затратные по времени» куски кода, как загрузка данных из сети или обработка изображений на main thread
(главном потоке), то работа вашего UI
начинает сильно замедляться и даже может привести к полному его «замораживанию». Как можно изменить архитектуру приложения, чтобы таких проблем не возникало? В этом случае на помощь приходит многопоточность (
сoncurrency
), которая позволяет одновременно выполнять две или более независимые задачи (tasks
): вычисления, загрузку данных из сети или с диска, обработку изображений и т.д.Переходим на Swift 3 с помощью миграционного «робота» в Xcode 8.1 и 8.2
Уже известно, что
Xcode 8.2
будет последним релизом, который поддерживает переходную версию Swift 2.3
. Поэтому нужно срочно подумать о миграции на Swift 3
. Я хочу поделиться некоторым опытом такой миграции на примере приложений, связанных со стэнфордским курсом «Developing iOS 9 Apps with Swift», как демонстрационных (их 12), так и полученных в результате выполнения Заданий этого обучающего курса (их 6 с вариантами). Они все разной сложности, но там есть и рисование, и многопоточность, и показ изображений с помощью
ScrollView
, и работа с сервером Twitter, и база данных Core Data, и работа с облачным сервисом Cloud Kit, и карты Map Kit. И все это было написано на Swift 2.2
(stanford.edu), а мне было необходимо перевести все приложения на Swift 3
. Конспект лекций стэнфордского курса на русском языке можно найти на сайте «О стэнфордских лекциях», а код — для Swift 2.3 на Github и для Swift 3 на Github.Доступны Стэнфордские курсы CS193P Весна 2016: Разработка iOS 9 приложений с помощью Swift
Стэнфордский курс «Developing iOS 9 Apps with Swift» теперь доступен на iTunes. Это долгожданное обновление предыдущего курса по iOS 8 и Swift.
Для того, чтобы воспользоваться этим контентом, вам нужно иметь только Mac — Macbook Pro, MacBook Air, iMac. Все программное обеспечение — бесплатное.
Этот курс в течение 10 недель читает профессор Пол Хегэрти. Он не только высвечивает множество нюансов операционной системы iOS и языка программирования Swift, которые не так-то легко найти в документации, но и снабжает вас приемами программирования на iOS, которые вы не найдете ни в одной книге (может быть, на WWDC 2011, 2012, 2013, 2014, 2015). Он многократно сократит ваш путь изучения. Реально, он — гений в преподавании программирования на iOS.
Адаптивные Split View Controller и Popover в iOS 9 (Swift). Часть 2
Это вторая часть обучающей статьи, связанной с изучением адаптивного поведения Split View Controller и Popover в iOS 9 на iPad и на iPhone, которое стало возможным благодаря концепции Size Classes. Обучение состоит в создания на Swift практических приложений, работающих с сервером Flickr.com, который является облачным сервисом для хранения фотографий.
В первой части перечислены пять интересных с точки зрения разработчика случаев применения адаптивного Split View Controller и Popover, которые отличаются сложностью Master. Detail везде один и тот же — единственный Image View Controller, вставленный в Navigation Controller и призванный показывать изображение фотографии:
1. Классический вариант: один элемент в Master, вставленный в Navigation Controller, (часто это Table View Controller)
2. Множество Table View Controller элементов, вставленных в Navigation Controller
3. Tab Bar Controller в качестве Master
4. Случай разных UI и разных пользовательских классов для приборов с разными Size Classes здесь не рассматривается, но идею можно посмотреть в “Адаптивный интерфейс с двумя storyboards для iOS 9”.
5. Адаптивный Popover
В первой части осуществлялось построение базового экспериментального приложения на Swift, которое было распространено на случаи 1-2. В этой статье мы будем дальше усложнять наше экспериментальное приложение и распространим его на случаи 3 и 5. Код для всех вариантов можно найти на Github.
Адаптивные Split View Controller и Popover в iOS 9 (Swift). Часть 1
С незапамятных времен Split View Controller и Popover в iOS были доступны только на iPad.
Начиная с iOS 8, они теперь работают и на iPad, и на iPhone, благодаря концепции Size Classes и их адаптивному поведению. Однако автоматическая адаптация, предложенная Apple «из коробки», чаще всего нас не устраивает и приходится писать небольшой дополнительный код, используя методы делегатов
UISplitViewControllerDelegate
и UIPopoverPresentationControllerDelegate
. В данной статье мы будем исследовать адаптивные способности Split View Controller и Popover на примере очень простых практических приложений, работающих с сервером Flickr.com, представляющим собой облачный сервис для хранения фотографий. Сама по себе эта задача имеет большой практический смысл, так как является часто встречающимся случаем, когда данные считываются с некоторого сервера и представляются затем ввиде связанных таблиц и изображений. Попутно мы будем демонстрировать “вживую” такие синтаксические конструкции Swift, как вычисляемые свойства c {get}
и {set}
, наблюдатели свойств didSet{}
, функции высшего порядка map, flatMap, filter
, вывод типа из контекста и перегрузку (overload) функций, совместное использование Swift и Objective-C кода, работу со структурами struct
, использование хранилища NSUserDefaults
и т.д. Но все же в этой статье акцент делается на более сложных конфигурациях адаптивных Split View Controller и Popover.Впоследствие все приведенные в этой статье приложения вы сможете использовать в качестве шаблонов для разработки ваших приложений с похожими задачами.
«Что нового в Swift 2?» на примерах. Часть 2
- фундаментальные конструкции языка, такие, как enums, scoping (область действия), синтаксис аргументов и т.д.
- сопоставление с образцом (pattern matching)
- управление ошибками (error handling)
Во второй части мы рассмотрим оставшиеся:
- расширения (extensions) протокола
- проверка доступности (availability checking)
- взаимодействие с Objective-C и С
Я буду рассматривать новые возможности Swift 2, сопровождая их примерами, код которых находится на Github.
Information
- Rating
- Does not participate
- Registered
- Activity