Must read. 7 свежих статей о Swift
Каждую неделю мы отбираем несколько свежих материалов из англоязычного интернета. В этом выпуске — статьи о Swift, языке для iOS и macOS.
g_hosh / shutterstock
Собираем нейронку на Swift с помощью фреймворка Metal Shaders
Зачем читать: если вы интересуетесь нейросетями или вам интересен фреймворк Metal Performance Shaders.
Где читать: на Medium.
Евгений Стефанков — разработчик под iOS и лауреат Swift Student Challenge 2020 и 2021. Он уже давно интересуется нейронками — даже написал статью о том, как собрать нейросеть на Swift с нуля. В своей новой статье он показывает, как сделать ту же нейросеть быстрее с помощью фреймворка Metal Performance Shaders.
Это полноценный пошаговый гайд — весь процесс создания умной сетки разобран детально и скрупулёзно: от необучаемых слоёв до обучения и оценки. В конце Евгений скормил нейронке знаки хираганы — японской слоговой азбуки. Через 10 минут программа уже вовсю классифицировала японские символы — с точностью 75%. С цифрами она справилась ещё лучше — за те же 10 минут точность выросла до 98%.
Фреймворк в несколько раз ускорил создание нейросети по сравнению со сборкой на голом Swift. И хотя нейросеть Евгения поддерживает только классификации, её довольно просто доработать напильником и заставить умничать на других задачах.
Тихий омут диспетчеризации методов в Swift
Зачем читать: чтобы лучше понять, как работает диспетчеризация.
Где читать: на Medium.
Диспетчеризация методов — какая-то тайная магия создателей языков программирования. Благодаря этому волшебству функции вызываются правильно и корректно.
Существуют три главных типа диспетчеризации:
- Статическая диспетчеризация — самая простая и быстрая. Она используется только для методов, которые не могут быть переопределены: Swift не тратит время на выбор нужного варианта. Явно задать статическую диспетчеризацию можно с помощью слов static и final.
- Диспетчеризация с помощью координирующей таблицы (vtable) используется для ссылочных типов и помогает сохранить наследование. Работает такая диспетчеризация относительно просто: генерируется таблица с правилами — в них написано, когда и какие версии одного и того же метода запускать.
- Диспетчеризация сообщением. У диспетчеризации таблицей есть недостаток: имплементации метода могут меняться и добавляться во время выполнения, так что таблица, созданная во время компиляции, может оказаться неверной. Диспетчеризация сообщением решает эту проблему, создавая новую таблицу уже во время выполнения.
Основная часть статьи — подробный гайд по типам диспетчеризации, однако автор не поскупился и бонусом накинул инструкции по работе с командами dynamic и @objc, а также с SIL-кодом.
Создание Firebase API на Swift
Зачем читать: чтобы узнать о более эффективном подходе к работе с Firebase.
Где читать: на Medium.
При работе с Firebase чаще всего создаётся специальный класс, который занимается созданием, чтением, модификацией и удалением (CRUD) объектов для репозитория. Каждый раз, когда появляется какой-то новый тип данных, нужно обновлять этот класс, дублировать все команды для нового типа. Из-за этого возникает много «рутинного» шаблонного кода.
Более эффективное решение — создать базовый бэкенд-класс с помощью обобщений. Он займётся всеми новыми классами, которые пройдут фильтр. В статье разобрана минималистичная версия приложения с бэкенд-API, которую можно использовать в качестве шаблона для своих аппок под iOS.
Property Wrappers в Swift: что это такое?
Зачем читать: чтобы глубоко разобраться в property wrappers.
Где читать: в блоге SwiftLee.
Property wrappers, или обёртки свойств, — довольно новое включение в Swift, которое позволяет значительно уменьшить количество шаблонного кода. Это своего рода дополнительный слой для объекта, который определяет поведение его свойств.
Автор статьи, Антуан ван дер Ли, — iOS-разработчик с многолетним стажем. Он объясняет, что такое property wrappers, и приводит понятные примеры.
В каких задачах помогут property wrappers:
- уменьшить количество шаблонного кода;
- эффективнее работать со свойствами;
- удобно получать и присваивать значения;
- добавлять новые свойства;
- работать с прогнозируемым значением, основанном на обёрнутом значении;
- получать доступ к приватным свойствам.
В статье есть примеры для всех этих возможностей и хранения опционалов.
Введение в функциональное реактивное программирование
Зачем читать: чтобы узнать о новой парадигме программирования и попробовать её в Swift.
Где читать: на Flexiple.
Что такое функциональное реактивное программирование?
Вкратце: это комбинация функционального и реактивного программирования. В нём часто используются функции высшего порядка.
А что такое функциональное программирование?
Это парадигма программирования, в основе которой лежат математические функции. Главное в этой парадигме — это скорее вычисление результата, а не пошаговые инструкции к действию.
И тогда в чём смысл реактивного программирования?
Это программирование с асинхронными потоками данных.
А что такое поток?
Поток — это упорядоченная во времени последовательность событий. По сути, в реактивном программировании всё: переменные, свойства, структуры данных — это потоки.
Под Swift написаны две классные библиотеки для реактивного программирования: RxSwift и RxCocoa. Первая более популярна, поэтому автор в основном говорит о ней.
Некоторые понятия RxSwift
- Наблюдаемое (Observables) — в этой библиотеке потоки представлены как наблюдаемые последовательности (observable sequences). Такую последовательность можно создать почти для любого объекта.
- DisposeBag — это что-то вроде сборщика мусора. DisposeBag помогает отписаться от уже ненужной последовательности.
- Субъекты (Subjects) — особый тип последовательностей, которые можно менять динамически.
- Привязка (Binding) — популярный оператор для привязки значения одной последовательности к другой.
- Комбинирование (Combine) — оператор для комбинирования двух последовательностей.
Перечисления в Swift: как избежать проблем
Зачем читать: чтобы эффективнее решать задачи с помощью перечислений.
Где читать: на Swift by Sundell.
Перечисления (enums) очень популярны в Swift: это один из самых полезных элементов, который помогает решить многие проблемы. Но это не панацея и в ряде случаев лучше решить проблему другим способом. Пример такой проблемы — отсутствие значения.
Представьте, что вы кодите приложение для подкастов и добрались до категорий. Логичное решение — создать перечисление всех возможных категорий и добавить к ним категории none и all.
Но есть метод получше: для категории none в Swift существует специальная функция. И если сделать свойство категории опционалом, уже не придётся клепать отдельную категорию none. Плюс так вы сможете использовать все функции опционалов — например, if let. Сплошная выгода :)
А ещё автор рассказывает, как без перечислений запрогать категорию all и исключения из категорий.
Миграция с Core Data на Realm
Зачем читать: если у вас есть приложение на SwiftUI и вы хотите перейти с Core Data на Realm.
Где читать: на Medium.
Переход с Core Data на Realm — достаточно частое явление. Если вы задумываетесь о переходе, то эта статья — для вас. Не стоит волноваться: и Core Data, и Realm работают с данными как с объектами, так что переход будет быстрым и безболезненным. Да, вам придётся внести в код несколько правок, зато вы сможете избавиться от кучи шаблонного кода.
В своей пошаговой инструкции Эндрю Морган рассмотрел два подхода к миграции, описал весь процесс и показал, как удобнее переносить пользовательские данные.