Библиотека мобильного разработчика | Android, iOS, Swift, Retrofit, Moshi, Chuck – Telegram
Библиотека мобильного разработчика | Android, iOS, Swift, Retrofit, Moshi, Chuck
9.55K subscribers
1.69K photos
83 videos
52 files
4.51K links
Все самое полезное для мобильного разработчика в одном канале.

По рекламе: @proglib_adv

Учиться у нас: https://proglib.io/w/b60af5a4

Для обратной связи: @proglibrary_feeedback_bot

РКН: https://gosuslugi.ru/snet/67a4adec1b17b35b6c0d8389
Download Telegram
Добавление цветов в иерархию представлений SwiftUI

В SwiftUI одним из наиболее элегантных способов настройки визуальных элементов является внедрение стилей. Вместо того чтобы вручную передавать явные цвета или параметры стиля по дереву представлений, SwiftUI позволяет внедрять информацию о стиле на более высоком уровне с помощью таких модификаторов, как .foregroundStyle(), .backgroundStyle(), и .tint(). Эти внедренные стили могут использоваться любым дочерним представлением, которое ссылается на соответствующие динамические значения.

Этот подход не только лаконичен, но и позволяет комбинировать элементы и использовать декларативный подход, что полностью соответствует философии дизайна SwiftUI.

Внедрение стилей в подпредставления

Вот простой пример, демонстрирующий, как стили могут неявно передаваться по иерархии представлений:

struct DemoView: View {
var body: some View {
DetailView()
.foregroundStyle(.blue)
.backgroundStyle(.pink)
.tint(.yellow)
}
}


В этом примере DemoView применяет три модификатора стиля:

🔘 .foregroundStyle(.blue) определяет стиль переднего плана, который будет наследоваться дочерними элементами, ссылающимися на .foreground.
🔘 .backgroundStyle(.pink) добавляет стиль фона.
🔘 .tint(.yellow) устанавливает глобальный оттенок, который влияет на элементы, использующие .tint.

Ни один из этих модификаторов не ссылается явно на внутреннюю реализацию DetailView, что делает код модульным и слабосвязанным.

Использование внедренных стилей

Теперь давайте посмотрим, как DetailView использует эти стили:

struct DetailView: View {
var body: some View {
Text("Primary text")
.foregroundStyle(.background)
.background(.foreground)

Text("Secondary text")
.foregroundStyle(.tint)
}
}


Здесь:

🔘 .foregroundStyle(.background) указывает тексту использовать заданный стиль фона (в данном случае .pink).
🔘 .background(.foreground) устанавливает для фона текста стиль переднего плана (в данном случае .blue).
🔘 Во второй текстовой метке используется .foregroundStyle(.tint), которое соответствует .yellow в родительском представлении.

Такой подход позволяет создавать многократно используемые представления с учётом темы. Представлениям не нужно знать, какие конкретные цвета они будут отображать — им нужно лишь обращаться к динамическим стилям, определяемым средой, таким как .foreground, .background, или .tint.

Заключительные мысли

Используя стилистические роли и подставляя значения извне, мы получаем возможность точно контролировать внешний вид, не перегружая внутренние компоненты представления явными параметрами.

🔸 Курс «Основы IT для непрограммистов»
🔸 Получить консультацию менеджера
🔸 Сайт Академии 🔸 Сайт Proglib

🐸 Библиотека мобильного разработчика

#PixelPerfect #MiddlePath #Swift
Please open Telegram to view this post
VIEW IN TELEGRAM
⚙️ Validator — элегантная и типобезопасная валидация входных данных

Validator — это современный лёгкий фреймворк Swift, обеспечивающий элегантную и типобезопасную валидацию входных данных. Созданный на основе мощной системы типов Swift, он легко интегрируется с UIKit и SwiftUI, что упрощает валидацию форм на всех платформах Apple.

Возможности:

🔘 Типобезопасная валидация — использует систему типов Swift для обеспечения безопасности во время компиляции
🔘 Богатый набор правил — встроенные валидаторы для распространённых случаев использования
🔘 Расширяемость — простота создания собственных правил валидации
🔘 Интеграция с UIKit — первоклассная поддержка UITextField и других компонентов UIKit
🔘 SwiftUI Native — обёртки свойств и модификаторы представлений для декларативной валидации
🔘 Управление формами — валидация нескольких полей с централизованным управлением состоянием
🔘 Легковесность — минимальный размер и отсутствие зависимостей
🔘 Протестировано — полное покрытие тестами

💻 Validator на GitHub

🔸 Курс «Специалист по ИИ»
🔸 Получить консультацию менеджера
🔸 Сайт Академии 🔸 Сайт Proglib

🐸 Библиотека мобильного разработчика

#буст #iOS
Please open Telegram to view this post
VIEW IN TELEGRAM
🐧🍎 Ставим Fedora на MacBook Pro 2019 с чипом T2 и не ломаем систему на первом же обновлении

Чип T2 в MacBook — это защита Apple от всего неродного, включая Linux. Но есть способ обойти все ловушки и получить Fedora с рабочим Wi-Fi, звуком и даже Touch Bar. Главное — знать правильную последовательность действий. Показываю на своём примере.

👉 Читать статью

🔸 Курс «Основы IT для непрограммистов»
🔸 Получить консультацию менеджера
🔸 Сайт Академии 🔸 Сайт Proglib

🐸 Библиотека мобильного разработчика

#MadeInProglib
Please open Telegram to view this post
VIEW IN TELEGRAM
CoreML и нейронки в кармане 📱

Мобильные процессоры (NPU) становятся мощнее, и всё больше вычислений переезжает на устройство. Чтобы писать быстрые ML-фичи под iOS/Android и понимать, как сжать модель без потери качества, нужно знать математику.
Запускаем курс «Математика для разработки AI-моделей».

Старт уже завтра.

💰 Цена: 28 200 ₽.

🔥 Для кого: Для тех, кто хочет выйти за рамки обычного UI/Networking.

Успейте занять место:

👉 Записаться

Тест на знание базы:
@proglib_academy_webinar_bot
😁2
🔒 Gradle-плагин для защиты секретов Android-приложения

Узнайте, как превратить API‑ключи и токены в невидимые в репозитории и APK данные с помощью собственного Gradle‑плагина.

👉 Читать статью

🔸 Курс «Математика для Data Science»
🔸 Получить консультацию менеджера
🔸 Сайт Академии 🔸 Сайт Proglib

🐸 Библиотека мобильного разработчика

#свежак #Android
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
⚙️ git worktree – параллельная работа в нескольких ветках без переключений

Мощная команда, которая позволяет работать с несколькими ветками Git одновременно в разных директориях. Больше не нужно постоянно переключаться между ветками или клонировать репозиторий несколько раз.

📌 Практические сценарии:

1. Параллельная разработка:

# Главная ветка в основной папке
# feature/auth в отдельной папке
git worktree add ../project-auth feature/auth

# Теперь можно работать с main и feature/auth одновременно!


2. Тестирование PR без переключений:

# Создать worktree для проверки PR коллеги
git worktree add ../pr-review-123 pr/feature-123

# Перейти в папку и запустить тесты
cd ../pr-review-123
npm test


3. Долгие операции в фоне:

# Запустить сборку в отдельной worktree
git worktree add ../project-build build-optimization
cd ../project-build
npm run build:production # Не блокирует основную работу


⚡️ Ключевые преимущества:

Нет конфликтов индекса – каждый worktree имеет свой собственный .git
Изоляция изменений – работа в одной ветке не влияет на другую
Экономия времени – мгновенное переключение между контекстами

📊 Пример рабочего процесса:

# 1. Основная работа в main
cd ~/projects/myapp

# 2. Создаем worktree для нового фича
git worktree add ~/projects/myapp-feature -b feature/new-payment

# 3. Работаем одновременно:
# Terminal 1 (main): git log --oneline
# Terminal 2 (feature): git add . && git commit -m "Add payment"

# 4. После мержа feature
git worktree remove ~/projects/myapp-feature


Pro-совет: Добавьте в .gitconfig:

ini
[alias]
wt = worktree
wt-list = worktree list
wt-add = worktree add
wt-remove = worktree remove


🔸 Курс «Основы IT для непрограммистов»
🔸 Получить консультацию менеджера
🔸 Сайт Академии 🔸 Сайт Proglib

🐸 Библиотека мобильного разработчика

#буст #JuniorKit
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2
Как найти деньги на создание игры?

Принять участие в шестом акселе «Фабрика видеоигр» в Москве.

Несколько фактов о нем:
- участвовать могут ЛЮБЫЕ команды — от больших компаний до парочки разрабов инди-игр;
- в программе акселератора: сессии с топ-экспертами, обучение, индивидуальный консалтинг;
- в финале всех пригласят на питчинг с инвесторами — реальный шанс привлечь деньги на разработку

За четыре предыдущих сезона (пятый в процессе питчинга) участники разработали 80 пилотных версий своих игр и уже выводят их на мировой рынок. Лучшие получили в совокупности более 150 миллионов рублей на развитие и масштабирование. А в этом сезоне кроме инвесторов будет еще Московский венчурный фонд - он выдаст персональные гранты.

Если ждешь знак от вселенной — вот он
ML на мобилках: пора учить матчасть

CoreML и ML Kit делают внедрение нейронок простым, но чтобы реально понимать, как оптимизировать модель под мобильное устройство, нужно знать базу.

Мы перезапустили курс по математике с живыми вебинарами.

Что в программе на этой неделе:

1. Линейная алгебра: векторы, матрицы, определители.

2. Линейная регрессия: как предсказывать значения и интерпретировать коэффициенты.

3. SVD-разложение: как снижать размерность данных (супер-актуально для мобайла).
Вы ещё успеваете присоединиться к потоку и получить доступ ко всем материалам.

Ссылка для регистрации (до 9 декабря):
https://clc.to/LojFzw
🎓 Считаем разницу в зарплатах джунов с вышкой и без

Из каждого утюга кричат, что в айти можно войти с улицы, просто выучив Python. Но статистика зарплат и требования топовых компаний говорят об обратном. Давай разберемся, где самоучке действительно рады, а где без профильного вуза (и даже PhD!) твое резюме полетит в корзину сразу после скрининга.

👉 Читать статью

🔸 Курс «Основы IT для непрограммистов»
🔸 Получить консультацию менеджера
🔸 Сайт Академии 🔸 Сайт Proglib

🐸 Библиотека мобильного разработчика

#MadeInProglib
Please open Telegram to view this post
VIEW IN TELEGRAM
🗓 Новости недели

Приготовили для вас дайджест по актуальному из мира iOS, Android.

🔵 Как я создавал язык для преобразования данных вместе с ChatGPT

Рассказ о том, как используя Codex, за пару месяцев плотной работы по вечерам и субботам спроектировать специализированный ЯП (кодовое имя Branchline), написать интерпретатор, компилятор, виртуальную машину, а затем перевести это всё на Kotlin Multiplatform (KMP), чтобы получить версию под JS для онлайн-песочницы.

🔵 Знакомство со Stencil или уроки шаблонного общения

Что любят все разработчики? Конечно, автоматизировать рутинные повторяющиеся действия! Автор расскажет, как в этом может помочь язык Stencil, широко известный в узких кругах iOS-разработчиков.

🔵 State-менеджмент «из коробки» во Flutter: эффективная альтернатива BLoC и Riverpod

В данной статье автор расскажет про встроенные инструменты Flutter, которые позволяют реализовать надежный и предсказуемый state-менеджмент без сторонних фреймворков. Вы узнаете, как использовать ValueNotifier и Provider для удобной работы с состоянием и когда такой подход является оптимальным.

🔹
Курс «Основы IT для непрограммистов»
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib

🐸 Библиотека мобильного разработчика

#свежак
Please open Telegram to view this post
VIEW IN TELEGRAM
Делегированные свойства (Delegated properties) в Kotlin

Делегированные свойства — это свойства, которые не хранят своё значение напрямую, а делегируют это значение другому объекту, который реализует интерфейс Delegate. При доступе к свойству, его значение запрашивается у делегата, который может выполнить какую-то дополнительную логику, а затем вернуть требуемое значение. Пример:

class Example {
var p: String by Delegate()
}


Ключевое слово by используется для обозначения свойств, методы чтения и записи которых реализованы другим объектом, который называют делегатом.

Синтаксис выглядит так: val/var <имя свойства>: <Тип> by <выражение>. Выражение после by — делегат, потому что обращения get(), set() к свойству будут делегированы его методам getValue() и setValue(). Делегат не обязан реализовывать какой-то интерфейс, достаточно, чтобы у него были метод getValue()setValue() для var'ов) с определённой сигнатурой.

В Kotlin существуют несколько встроенных делегатов для работы с делегированными свойствами:

🔘 lazy() — позволяет создавать лениво инициализированные свойства
🔘 observable() — позволяет реагировать на изменения свойства
🔘 vetoable() — позволяет отклонять изменения значения свойства на основе заданного условия
🔘 notNull() — гарантирует, что свойство не будет иметь значение null
🔘 map() — позволяет хранить значения свойств в словаре (Map)

Кроме того, в Kotlin можно создавать свои собственные делегаты, реализуя интерфейс ReadOnlyProperty или ReadWriteProperty. Это дает возможность создавать кастомные поведения для свойств, например, кеширование значений или логирование операций чтения/записи.

🔹 Курс «Основы IT для непрограммистов»
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib

🐸 Библиотека мобильного разработчика

#буст #JuniorKit #Kotlin
Please open Telegram to view this post
VIEW IN TELEGRAM
1
Принудительная перезагрузка представления в SwiftUI

В SwiftUI представления являются декларативными и автоматически перестраиваются при изменении их базового состояния. Однако бывают ситуации, когда требуется принудительно перезагрузить представление. Один из распространённых способов добиться этого — использовать модификатор .id(_:) в сочетании с управляемым состоянием идентификатором.

🔹 Пример реализации

Вот минимальный пример того, как можно принудительно перезагрузить представление:

struct DemoView: View {
@State private var viewId = UUID()

var body: some View {
VStack {
Text(viewId.uuidString)
.id(viewId) // forces SwiftUI to recreate this view

Button("Retry") {
viewId = UUID()
}
}
}
}


В этом примере при каждом нажатии на кнопку Retry viewId заменяется на новое UUID. Поскольку .id(viewId) прикреплено к тексту, SwiftUI считает его новым представлением и уничтожает старое поддерево, заменяя его новым.

🔹 Преимущества

Гарантированный сброс

Такой подход гарантирует, что представление и его внутреннее состояние будут полностью сброшены. Все @State или внутренние привязки в поддереве удаляются, и создаётся чистый экземпляр иерархии представлений.

Полезно для сценариев восстановления

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

Предсказуемое поведение

Поскольку SwiftUI в значительной степени полагается на идентификацию для согласования представлений, явное управление с помощью .id(_:) делает перезагрузку предсказуемой и понятной.

🔹 Недостатки

Снижение производительности

При принудительной перезагрузке старое представление удаляется и создаётся новое с нуля. Если иерархия представлений большая или сложная, это может привести к ненужным затратам ресурсов и снижению производительности рендеринга.

Потеря локального состояния

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

Решение, ориентированное на симптомы

Использование принудительных перезагрузок может указывать на более серьёзные проблемы с архитектурой. Часто более идиоматичный для SwiftUI подход заключается в более тщательном структурировании состояния, чтобы обновления распространялись естественным образом, а не в обход системы согласования.

🔹 Когда использовать

Принудительную перезагрузку представления следует рассматривать как крайнюю меру, а не как предпочтительное решение. Это полезно для повторных попыток, очистки поврежденного состояния или создания прототипов. В рабочем коде старайтесь моделировать поток состояний так, чтобы обновления SwiftUI происходили автоматически. Если вы часто прибегаете к .id(_:), возможно, стоит пересмотреть свой подход к управлению состоянием.

🔹 Заключение

Использование .id(_:) в сочетании с изменяющимся значением, например с UUID, — это простой способ принудительно перезагрузить представление SwiftUI. Это надёжный механизм для сброса настроек представления, но он имеет свои недостатки с точки зрения производительности и потери состояния. Как и большинство методов, его лучше применять выборочно, в тех случаях, когда требуется настоящий «сброс» настроек, а другие подходы менее эффективны.

🔸 Курс «Основы IT для непрограммистов»
🔸 Получить консультацию менеджера
🔸 Сайт Академии 🔸 Сайт Proglib

🐸 Библиотека мобильного разработчика

#PixelPerfect #MiddlePath #Swift
Please open Telegram to view this post
VIEW IN TELEGRAM