Swift Regex: работа с RegexBuilder на примере приложения со списком фильмов
Поиск в тексте не всегда означает поиск точного слова или последовательности символов. Иногда хочется найти закономерность.
Возможно, вы ищете слова, написанные прописными буквами, слова, содержащие цифры, или даже слово, которое вы, возможно, написали с ошибкой в статье, которую пишете, и хотите быстро найти и исправить.
Для этого регулярные выражения являются идеальным решением.
К счастью, Apple значительно упростила их использование в Swift 5.7.
📖 Из этой статьи вы сможете узнать:
1️⃣ Что такое регулярное выражение и как его использовать.
2️⃣ Как Swift 5.7 упростил работу с регулярками.
3️⃣ Как захватить части строки, которую вы ищете.
4️⃣ Как использовать
5️⃣ Как загрузить плохо отформатированный текстовый файл в модель данных.
6️⃣ Как обрабатывать несоответствия при загрузке данных.
🛠 Код приложения доступен по этой ссылке.
@iOS Dev
Поиск в тексте не всегда означает поиск точного слова или последовательности символов. Иногда хочется найти закономерность.
Возможно, вы ищете слова, написанные прописными буквами, слова, содержащие цифры, или даже слово, которое вы, возможно, написали с ошибкой в статье, которую пишете, и хотите быстро найти и исправить.
Для этого регулярные выражения являются идеальным решением.
К счастью, Apple значительно упростила их использование в Swift 5.7.
📖 Из этой статьи вы сможете узнать:
1️⃣ Что такое регулярное выражение и как его использовать.
2️⃣ Как Swift 5.7 упростил работу с регулярками.
3️⃣ Как захватить части строки, которую вы ищете.
4️⃣ Как использовать
RegexBuilder
для построения сложного выражения.5️⃣ Как загрузить плохо отформатированный текстовый файл в модель данных.
6️⃣ Как обрабатывать несоответствия при загрузке данных.
🛠 Код приложения доступен по этой ссылке.
@iOS Dev
Последовательная анимация в SwiftUI: советы, хитрости и примеры
Одно из преимуществ SwiftUI в упрощении создания подобных вещей.
🧐 Не нужно быть опытным разработчиком, чтобы сделать несколько симпатичных анимаций в вашем приложении.
Базовые эффекты реализуются довольно быстро и гибко, а немного разобравшись в API, вы сможете создавать анимации, которые оживят ваше приложение в кратчайшие сроки.
📖 В этой статье описаны некоторые практические примеры и полезные советы, которые помогут вам в достижении ваших целей.
@iOS Dev
Одно из преимуществ SwiftUI в упрощении создания подобных вещей.
Базовые эффекты реализуются довольно быстро и гибко, а немного разобравшись в API, вы сможете создавать анимации, которые оживят ваше приложение в кратчайшие сроки.
📖 В этой статье описаны некоторые практические примеры и полезные советы, которые помогут вам в достижении ваших целей.
@iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
Добавление растягиваемого заголовка в ScrollView с параллакс-эффектом (для Swift UI)
Это широко используемый и один из популярных элементов, который, как ни странно, недоступен в качестве родного компонента
Если не совсем понятно, о чём речь, посмотрите на пример экрана альбома из приложения Spotify iOS.
⭐️ Сначала заголовок растягивается, когда вы тянете его вниз, затем прокручивается вместе с остальным содержимым и прилипает к панели навигации с красивой анимацией затухания. При этом используется дополнительно эффект параллакса.
📖 В этом материале задачи решаются по отдельности, и уже после объединения достигается конечный результат.
🛠 Автор даже вынес реализацию в небольшую библиотеку, но перед её использованием уделите внимание этому посту.
@iOS Dev
Это широко используемый и один из популярных элементов, который, как ни странно, недоступен в качестве родного компонента
UIKit
или SwiftUI
. Если не совсем понятно, о чём речь, посмотрите на пример экрана альбома из приложения Spotify iOS.
📖 В этом материале задачи решаются по отдельности, и уже после объединения достигается конечный результат.
🛠 Автор даже вынес реализацию в небольшую библиотеку, но перед её использованием уделите внимание этому посту.
@iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
swift -e: опция командной строки, которая позволяет использовать однострочники Swift
📕 Однострочник Swift — это строка кода, которую можно выполнить непосредственно из командной строки без создания отдельного файла.
Это удобный и эффективный способ выполнять небольшие разовые задачи или манипулировать данными.
В Swift 5.8/Xcode 14.3 Beta 1 появилась возможность использовать такие однострочники.
Каждое значение переключателя «-e» обрабатывается как одна строка исходного кода, которые объединяются во временный файл main.swift.
📖 В этом материале разбираются аргументы, возможности использования и рассматривается потенциал для использования в скриптах.
@iOS Dev
Это удобный и эффективный способ выполнять небольшие разовые задачи или манипулировать данными.
В Swift 5.8/Xcode 14.3 Beta 1 появилась возможность использовать такие однострочники.
Каждое значение переключателя «-e» обрабатывается как одна строка исходного кода, которые объединяются во временный файл main.swift.
📖 В этом материале разбираются аргументы, возможности использования и рассматривается потенциал для использования в скриптах.
@iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
Опенсорсный клиент на SwiftUI для Mastodon: демонстрация реализованных методов и фич
IceCubesApp — это приложение с открытым исходным кодом для доступа к децентрализованной социальной сети Mastodon! Он полностью построен на SwiftUI, что делает его быстрым, легким и простым в использовании.
Проект разделен на разные пакеты Swift, чтобы упростить управление кодовой базой и ее обслуживание.
Каждый из них ориентирован на определенный аспект приложения, такой как пользовательский интерфейс, сетевое взаимодействие или модели данных.
Этот модульный подход упрощает совместную работу и гарантирует, что код организован и прост для понимания.
В большинстве случаев архитектура представляет собой простой MVVM.
📖 Thomas Ricouard написал статью, в которой рассказал о некоторых аспектах и реализованных фичах.
🛠 Приложение на Github доступно по ссылке (⭐️2 100).
@iOS Dev
IceCubesApp — это приложение с открытым исходным кодом для доступа к децентрализованной социальной сети Mastodon! Он полностью построен на SwiftUI, что делает его быстрым, легким и простым в использовании.
Проект разделен на разные пакеты Swift, чтобы упростить управление кодовой базой и ее обслуживание.
Каждый из них ориентирован на определенный аспект приложения, такой как пользовательский интерфейс, сетевое взаимодействие или модели данных.
Этот модульный подход упрощает совместную работу и гарантирует, что код организован и прост для понимания.
В большинстве случаев архитектура представляет собой простой MVVM.
📖 Thomas Ricouard написал статью, в которой рассказал о некоторых аспектах и реализованных фичах.
🛠 Приложение на Github доступно по ссылке (⭐️2 100).
@iOS Dev
Quick actions для iOS: интеграция и примеры
🧑💻 Quick actions — отличный способ предоставить пользователям быстрый доступ к общим функциям вашего приложения на главном экране.
Пользователь может коснуться и удерживать иконку приложения, чтобы отобразить набор ярлыков или действий, которые можно выполнить прямо с хоумскрина.
📖 В этом материале вы сможете узнать, как создавать:
1️⃣ Static quick actions, которые всегда доступны для вашего приложения.
2️⃣ Dynamic quick actions, которые ваше приложение может определить в рантайме.
3️⃣ Как поддерживать оба типа быстрых действий на примере тестового приложения.
@iOS Dev
Пользователь может коснуться и удерживать иконку приложения, чтобы отобразить набор ярлыков или действий, которые можно выполнить прямо с хоумскрина.
📖 В этом материале вы сможете узнать, как создавать:
1️⃣ Static quick actions, которые всегда доступны для вашего приложения.
2️⃣ Dynamic quick actions, которые ваше приложение может определить в рантайме.
3️⃣ Как поддерживать оба типа быстрых действий на примере тестового приложения.
@iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Реализация вращения линейного градиента на SwiftUI
Оказывается, что это просто нормализованная пара X/Y под капотом, так что при выборе подходящих X и Y, можно рисовать свои градиенты под любым углом.
📖 Автор рассказывает о том, как несложно реализовать подобный эффект и приводит пример кода.
@iOS Dev
LinearGradient
принимает в качестве управления направлением аргумент типа UnitPoint
. Оказывается, что это просто нормализованная пара X/Y под капотом, так что при выборе подходящих X и Y, можно рисовать свои градиенты под любым углом.
📖 Автор рассказывает о том, как несложно реализовать подобный эффект и приводит пример кода.
@iOS Dev
This media is not supported in your browser
VIEW IN TELEGRAM
Реализация показа аннотаций диаграмм при наведении в Swift Charts
📖 В этом посте можно узнать, как создать интерактивную гистограмму, которая показывает аннотации при наведении
Отметки столбцов будут отражать данные о продажах трех разных продуктов за год, сгруппированные по месяцам.
Кроме этого, в аннотациях будут указаны точные данные о продажах каждого продукта за определенный месяц.
🛠 Пример реализации доступен на github.
@iOS Dev
📖 В этом посте можно узнать, как создать интерактивную гистограмму, которая показывает аннотации при наведении
Отметки столбцов будут отражать данные о продажах трех разных продуктов за год, сгруппированные по месяцам.
Кроме этого, в аннотациях будут указаны точные данные о продажах каждого продукта за определенный месяц.
🛠 Пример реализации доступен на github.
@iOS Dev
🚨Срочно обновите fastlane!
В последние пару дней многие могли столкнуться с проблемой авторизации фастлейна, которая на самом деле ещё серьёзнее.
Дело в том, что теперь Apple требует заголовок
❗️ Отсутствие этого заголовка приводит к запрету доступа и возможной блокировке учетной записи Apple ID (некоторых, в том числе и один из моих личных аккаунтов это затронуло).
📔 Детальнее в этом пулл-реквесте: обсуждение и в этой теме.
В версии 2.212.1 эту проблему устранили, однако найстойчиво рекомендуется перейти на ключи App Store Connect API (как раз этот способ я использую в приложении Starly).
🛠Ссылка на актуальную версию fastlane здесь.
[UPD] Проблема затронула также и пользователей Xcodes.
@iOS Dev
В последние пару дней многие могли столкнуться с проблемой авторизации фастлейна, которая на самом деле ещё серьёзнее.
Дело в том, что теперь Apple требует заголовок
X-APPLE-HC
при входе в https://idmsa.apple.com/appleauth/auth/signin
. 📔 Детальнее в этом пулл-реквесте: обсуждение и в этой теме.
В версии 2.212.1 эту проблему устранили, однако найстойчиво рекомендуется перейти на ключи App Store Connect API (как раз этот способ я использую в приложении Starly).
🛠Ссылка на актуальную версию fastlane здесь.
[UPD] Проблема затронула также и пользователей Xcodes.
@iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
Создание приложения, похожего на стандартный iOS Timer с помощью SwiftUI
📖 В этом материале рассказывается, как повторить стандартный таймер на SwiftUI, ориентируясь на следующие 4 части интерфейса:
1️⃣
2️⃣ Элементы управления
3️⃣
4️⃣ Элемент управления
Каждый из компонентов пользовательского интерфейса создаётся по отдельности.
🛠 Исходный код проекта доступен здесь.
@iOS Dev
📖 В этом материале рассказывается, как повторить стандартный таймер на SwiftUI, ориентируясь на следующие 4 части интерфейса:
1️⃣
TimePickerView
.2️⃣ Элементы управления
StartButton
и StopButton
.3️⃣
CircularProgressView
, который виден только при активном таймере.4️⃣ Элемент управления
PauseButton
, который виден также только при активном таймере.Каждый из компонентов пользовательского интерфейса создаётся по отдельности.
🛠 Исходный код проекта доступен здесь.
@iOS Dev
Создание шаблонов заголовков в Xcode для Swift Packages
Если вы используете
1️⃣ Нет шаблона заголовка.
2️⃣ Нет запроса для имени файла.
📖 В этом материале есть решение для обеих проблем (вы можете использовать его и под свои рабочие процессы).
📖 А про изменение стандартных заголовков в файлах Xcode есть небольшой пост вот тут.
@iOS Dev
Если вы используете
Swift Package
, при создании нового файла возникают две неприятные проблемы:1️⃣ Нет шаблона заголовка.
2️⃣ Нет запроса для имени файла.
📖 В этом материале есть решение для обеих проблем (вы можете использовать его и под свои рабочие процессы).
📖 А про изменение стандартных заголовков в файлах Xcode есть небольшой пост вот тут.
@iOS Dev
Три способа передачи данных при использовании WatchConnectivity
⌚При работе с
Основной точкой взаимодействия является класс
И хотя Apple рекомендует использовать собственные возможности
📖 В этом материале автор рассказывает о своём опыте работы с
@iOS Dev
⌚При работе с
watchOS
, существуют различные методы для связи между устройствами iPhone и Apple Watch. Основной точкой взаимодействия является класс
WCSession
. Этот объект используется для создания соединения между телефоном и часами.И хотя Apple рекомендует использовать собственные возможности
URLSession
для запроса данных, методы из поста предназначены для передачи небольших объемов информации.📖 В этом материале автор рассказывает о своём опыте работы с
watchOS
и плюсах и минусах каждого из способов связи между Apple Watch и iPhone.@iOS Dev
Зарплаты разработчиков во второй половине 2022
🟢 По сравнению с первой половиной 2022 года, зарплаты ощутимо выросли у стажеров — на 14%. Немного подросли зарплаты сеньоров и лидов — по 4%. Практически не изменились зарплаты мидлов и джунов.
🟢 Больше всего выросли зарплаты разработчиков Delphi — на 28%.
Медианная зарплата Objective-С разработчиков выросла на 4% — 260 000 ₽.
🤑 Медианная зарплата джунов на Swift — 95 000 ₽ (+9%), процентно схожий рост у мидлов, у сеньоров +3%.
💪 Среди лидов больше всего платят Swift-разработчикам — 350 000 ₽ , а меньше всего лиды получают в 1С.
@iOS Dev — о важном
🟢 По сравнению с первой половиной 2022 года, зарплаты ощутимо выросли у стажеров — на 14%. Немного подросли зарплаты сеньоров и лидов — по 4%. Практически не изменились зарплаты мидлов и джунов.
🟢 Больше всего выросли зарплаты разработчиков Delphi — на 28%.
Медианная зарплата Objective-С разработчиков выросла на 4% — 260 000 ₽.
@iOS Dev — о важном
Please open Telegram to view this post
VIEW IN TELEGRAM
С помощью нового показателя в App Analytics вы можете оценить производительность своего приложения, сравнив ее с аналогичными приложениями в App Store.
Выкатили сравнение по следующим показателям:
🔘Коэффициент конверсии.
🔘Коэффициент удержания на 1-й, 7-й и 28-й день.
🔘Показатель сбоев.
🔘Средний доход на одного платящего пользователя.
Приложения в одной и той же категории App Store группируются вместе.
🌐 На официальном сайте можно прочитать про каждый параметр подробнее, а также узнать про советы по улучшению показателей.
@iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
Визуальное справочное руководство для документирования кода на Swift
📖 В этом огромном материале Marco Eidinger представляет полный обзор параметров для документирования.
Кроме этого, он делится советами и рекомендациями по эффективному созданию документации, а также рассматривает различия между
@iOS Dev
📖 В этом огромном материале Marco Eidinger представляет полный обзор параметров для документирования.
Кроме этого, он делится советами и рекомендациями по эффективному созданию документации, а также рассматривает различия между
Xcode Quick Help
по сравнению с DocC Renderer
и Jazzy.@iOS Dev
Различные способы сортировки массива строк в Swift
В Swift есть два способа сортировки: тот, который мутирует исходный массив, и тот, который этого не делает.
У них обоих одно и то же требование: элемент в коллекции должен соответствовать протоколуComparable .
Типы, соответствующие этому протоколу, можно сравнивать с помощью операторов
📖 В этом материале рассказывается о различных способах сортировки, а также объясняется, в каких случаях
@iOS Dev
В Swift есть два способа сортировки: тот, который мутирует исходный массив, и тот, который этого не делает.
У них обоих одно и то же требование: элемент в коллекции должен соответствовать протоколу
Типы, соответствующие этому протоколу, можно сравнивать с помощью операторов
<, <=, >=
и >
. 📖 В этом материале рассказывается о различных способах сортировки, а также объясняется, в каких случаях
localizedStandardCompare
поможет справиться, например, с упорядочиванием имен формата Name2.txt
, Name7.txt
, и Name25.txt
.@iOS Dev
О сложном пути и о Гунсунь Луну из царства Чжао
Пост не только о разработке, но и о том, что мне кажется важным
Если бы за последние 25 лет авиационная промышленность развивалась столь же стремительно, как вычислительная техника, то Boeing 767 можно было бы приобрести сегодня за 500 долларов и облететь на нем земной шар за 20 мин, израсходовав при этом 19 литров горючего. Цитата из журнала «В мире науки» (1983, 8 выпуск).
⏳ Когда мы видим сложную задачу или что-то, кажущееся на первый взгляд недостижимым, можно посчитать, что для достижения этой цели потребуется бесконечное количество времени или иных ресурсов. И очень часто эта возможность так и остаётся возможностью.
Это касается хардорных фич, объёмного рефакторинга, попаданию в IT в целом, или участию в каких-то контестах, в частности.
Метафорически это можно сравнить с игрой в умники и умницы, подсознательно хочется выбрать зелёную дорожку с двумя ошибками вместо красной, которая этого не прощает.
Иногда хочется быстрее прийти к финишу в одном соревновании. На мой взгляд, гораздо важнее выработать технику, которая будет с вами навсегда. Неважно, играете вы в квизы или занимаетесь спортом, стабильность важнее кратковременного успеха, а нахождение в топ-10 на протяжении сезона лучше одной случайной победы.
⚽️ В футболе такая же параллель: вчерашняя победа Ливерпуля со счётом 7-0 невероятна, но капитан Манчестер Юнайтед не должен пихать судью на 86 минуте матча. В целом, лучше проиграть один раз 7-0, чем 7 раз по 1-0.
Несмотря на то, что стремление к лучшему естественно, как известно - это враг хорошего (спасибо, Вольтер).
Гунсунь Луну сказал: «Если от палки длиной в один чи ежедневно отнимать половину, это не завершится и через 10000 поколений».
Важно знать меру. И 1 000 задач на литкоде это замечательно, но столько ли нужно на самом деле?
@iOS Dev
Пост не только о разработке, но и о том, что мне кажется важным
Если бы за последние 25 лет авиационная промышленность развивалась столь же стремительно, как вычислительная техника, то Boeing 767 можно было бы приобрести сегодня за 500 долларов и облететь на нем земной шар за 20 мин, израсходовав при этом 19 литров горючего. Цитата из журнала «В мире науки» (1983, 8 выпуск).
⏳ Когда мы видим сложную задачу или что-то, кажущееся на первый взгляд недостижимым, можно посчитать, что для достижения этой цели потребуется бесконечное количество времени или иных ресурсов. И очень часто эта возможность так и остаётся возможностью.
Это касается хардорных фич, объёмного рефакторинга, попаданию в IT в целом, или участию в каких-то контестах, в частности.
Метафорически это можно сравнить с игрой в умники и умницы, подсознательно хочется выбрать зелёную дорожку с двумя ошибками вместо красной, которая этого не прощает.
Иногда хочется быстрее прийти к финишу в одном соревновании. На мой взгляд, гораздо важнее выработать технику, которая будет с вами навсегда. Неважно, играете вы в квизы или занимаетесь спортом, стабильность важнее кратковременного успеха, а нахождение в топ-10 на протяжении сезона лучше одной случайной победы.
⚽️ В футболе такая же параллель: вчерашняя победа Ливерпуля со счётом 7-0 невероятна, но капитан Манчестер Юнайтед не должен пихать судью на 86 минуте матча. В целом, лучше проиграть один раз 7-0, чем 7 раз по 1-0.
Несмотря на то, что стремление к лучшему естественно, как известно - это враг хорошего (спасибо, Вольтер).
Гунсунь Луну сказал: «Если от палки длиной в один чи ежедневно отнимать половину, это не завершится и через 10000 поколений».
Важно знать меру. И 1 000 задач на литкоде это замечательно, но столько ли нужно на самом деле?
@iOS Dev
Реализация поддержки ссылок с обработкой нажатий в UILabel на Swift
Конечно, можно реализовать это на базе
🛠 Однако реализация не так проста, и для этого нам потребуется собственные
📖 В этом материале рассказывается, как создать такие ссылки с обработкой тапов.
@iOS Dev
UILabel
поддерживает отображение строк с атрибутами ссылки, но не позволяет нажимать на них и открывать их в браузере. Конечно, можно реализовать это на базе
UITextView
, но это более тяжелый компонент и, следовательно, может быть не лучшим выбором. 🛠 Однако реализация не так проста, и для этого нам потребуется собственные
NSLayoutManager
, NSTextStorage
и NSTextContainer
.📖 В этом материале рассказывается, как создать такие ссылки с обработкой тапов.
@iOS Dev
Генерация похожих цветов в Swift или почему RGB не всегда лучший выбор
Теоретически RGB — это группа цветовых пространств, которая позволяет указать дисплею, какое напряжение требуется каждому субпикселю.
Однако на практике теперь у нас есть телефоны с дисплеями, которые позволяют отображать более 100% красного цвета, называемым суперкрасным.
О RGB тоже трудно думать. Красный, зеленый и синий аддитивный свет ведут себя не так, как мы привыкли — вы можете видеть отдельные цвета вблизи, но по мере удаления они смешиваются вместе, и вы начинаете видеть только один цвет.
Наконец, RGB трудно манипулировать. Если вы начнете с черного, вы можете увеличить количество «красного» в палитре цветов RGB, что сделает все более красным. Все идет нормально. Затем вы начинаете увеличивать «зеленый», и вы получаете… желтый?
Но есть и другие представления цветов, которые легче поддаются изменению.
📖 В этом необычном материале автор делится своими размышлениями о генерации цветов на Swift и рассказывает о выводах, к которым пришёл.
Например, вы можете прочесть о цветовом пространстве Hue-Chroma-Luminance.
🛠 И даже немного поиграть с палитрой цветов, примеры кода: тут, тут, здесь или вот в этом gist.
@iOS Dev —в день 8 марта тема цветов выбрана неслучайно, поздравляю всех девушек с международным женским днём ❤️🔥🌹
Теоретически RGB — это группа цветовых пространств, которая позволяет указать дисплею, какое напряжение требуется каждому субпикселю.
Однако на практике теперь у нас есть телефоны с дисплеями, которые позволяют отображать более 100% красного цвета, называемым суперкрасным.
О RGB тоже трудно думать. Красный, зеленый и синий аддитивный свет ведут себя не так, как мы привыкли — вы можете видеть отдельные цвета вблизи, но по мере удаления они смешиваются вместе, и вы начинаете видеть только один цвет.
Наконец, RGB трудно манипулировать. Если вы начнете с черного, вы можете увеличить количество «красного» в палитре цветов RGB, что сделает все более красным. Все идет нормально. Затем вы начинаете увеличивать «зеленый», и вы получаете… желтый?
Но есть и другие представления цветов, которые легче поддаются изменению.
📖 В этом необычном материале автор делится своими размышлениями о генерации цветов на Swift и рассказывает о выводах, к которым пришёл.
Например, вы можете прочесть о цветовом пространстве Hue-Chroma-Luminance.
🛠 И даже немного поиграть с палитрой цветов, примеры кода: тут, тут, здесь или вот в этом gist.
@iOS Dev —