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

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

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

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

РКН: https://gosuslugi.ru/snet/67a4adec1b17b35b6c0d8389
Download Telegram
Перегрузка функций в Swift

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

func sum(_ x: Int, _ y : Int){
print(x+y)
}
func sum(_ x: Double, _ y: Double){
print(x+y)
}

func sum(_ x: Int, _ y: Int, _ z: Int ){
print(x + y + z)
}

sum(1, 2) // 3
sum(1.2, 2.3) // 3.5
sum(2, 3, 4) // 9


В данном случае все три функции называются sum, но так как они отличаются либо по количеству параметров, либо по их типу. При вызове данной функции Swift по типу и количеству параметров сможет распознать, какую именно версию функции sum надо использовать.

Также перегруженные версии одной функции могут отличаться по типу возвращаемого значения:

func sum(_ x: Int, _ y : Int) -> Int{
return x + y
}
func sum(_ x: Int, _ y : Int) -> Double{
return 2 * Double(x + y) // преобразует результат в Double
}

let a : Int = sum(1, 2) // 3
let b : Double = sum(1, 2) // 6.0

print(a) // 3
print(b) // 6.0


В данном случае определены две версии функции sum, которые совпадают по типу и количеству параметров, но различаются по типу возвращаемого значения.

Константа a представляет тип Int, поэтому в выражении let a : Int = sum(1, 2) компилятор увидит, что необходима версия, которая возвращает значение Int, и будет использовать эту версию. Аналогично в выражении let b : Double = sum(1, 2) константа b представляет тип Double, поэтому здесь будет применяться версия функции sum, которая возвращает значение Double. То есть в данном случае у нас ошибок не возникнет.

Однако теперь рассмотрим другую ситуацию:

func sum(_ x: Int, _ y : Int) -> Int{
return x + y
}
func sum(_ x: Int, _ y : Int) -> Double{
return 2 * Double(x + y) // преобразует результат в Double
}

let a = sum(1, 2) // Ошибка
let b = sum(1, 2) // Ошибка


Здесь явным образом не указано, какой тип представляют константы a и b, поэтому их тип будет выводиться изрезультата вызова sum(1, 2). Но теперь компилятор не знает, какую именно версию функции sum использовать, так как тип констант неизвестен. В итоге в данном случае мы столкнемся с ошибкой.

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

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

#буст #JuniorKit #Swift
Please open Telegram to view this post
VIEW IN TELEGRAM
📘 4 декабря стартует набор на курс «Математика для разработки AI-моделей»

Если вы работаете с моделями или хотите перейти в DS/ML, декабрь — идеальный момент закрыть фундаментальные пробелы.

На курсе вы разберёте ключевые разделы, которые лежат в основе современных AI-моделей: линейная алгебра, анализ, оптимизация, математический анализ, вероятности, статистика. Всё через практику в Python.

В программе живые занятия с экспертами AI-индустрии (SberAI, ВШЭ, WB&Russ), разбор реальных задач, квизы и финальный проект.

🌐 Формат: онлайн + доступ к записям

🎁 Бонусы: курс «Школьная математика» в подарок, бесплатный тест по математике

После лекций будет разбор ваших решений и возможность задать вопросы преподавателям.

👉 Записаться на курс
🎮 Локализация пакетов Swift в приложении для iOS

Современные архитектуры iOS часто основаны на модульности, а Swift Package Manager стал предпочтительным способом структурирования повторно используемых компонентов. Каждый модуль может содержать собственные ресурсы, в том числе локализованные строки, изображения и другие материалы. На бумаге это позволяет разрабатывать и выпускать каждую функцию независимо от других. Однако на практике локализация в Swift Packages не всегда работает так, как ожидают разработчики, после интеграции этих модулей в приложение.

Часто возникает одна и та же проблема: локализованные строки в пакете Swift работают во время разработки, но как только пакет используется в реальном приложении, все строки возвращаются к английскому варианту. Даже если пакет настроен правильно, локализованные .lproj папки игнорируются во время выполнения. Такое поведение может сбивать с толку, если вы ожидаете, что локализация будет работать автоматически во всех пакетах.

🔹 Почему игнорируются локализации в пакетах Swift

Пакеты Swift создаются в виде собственных наборов ресурсов, отдельных от основного набора ресурсов приложения. Несмотря на то, что .strings файлы хранятся в этих наборах и доступ к ним осуществляется через Bundle.module, система по-прежнему полагается на то, что хост-приложение объявляет, какие локализации оно поддерживает.

Если в конфигурации основного приложения явно не указан язык, iOS считает этот язык неподдерживаемым на уровне приложения. В результате среда выполнения возвращается к языку разработки по умолчанию, обычно английскому, независимо от того, какой язык доступен в пакете.

Это ожидаемое поведение системы локализации Apple, а не ошибка. Только основной пакет определяет языковые возможности приложения.

🔹 Необходимое исправление: объявление локализаций в основном приложении

Чтобы локализация Swift Package работала стабильно, в основном приложении необходимо объявить все поддерживаемые языки в Info.plist под ключом CFBundleLocalizations. После добавления этого списка система будет корректно обрабатывать локализованные строки из всех пакетов ресурсов, в том числе созданных с помощью Swift Package.

Минимальная конфигурация может выглядеть следующим образом:

<key>CFBundleLocalizations</key>
<array>
<string>en</string>
<string>fr</string>
</array>


После добавления этой записи ранее игнорируемые .lproj папки внутри пакетов Swift Package начинают работать сразу.

🔹 Заключение

Локализация пакетов Swift Package не представляет сложности, если вы понимаете, как система определяет языки в пакетах. Даже если модули содержат собственные .lproj папки, основное приложение должно явно указывать все поддерживаемые локализации. Добавление CFBundleLocalizations в Info.plist решает проблему возврата к английскому языку и обеспечивает правильное поведение локализованных ресурсов из пакетов Swift Package.

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

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

#АрхитектурныйКод #MiddlePath #Swift
Please open Telegram to view this post
VIEW IN TELEGRAM
🎁 Топ вакансий для мобильных разработчиков за неделю

Android Developer (Middle+ / Senior) — от 250 000 до 350 000 ₽, удалёнка

Программист (разработчик) flutter — от 100 000 до 220 000 ₽, удалёнка

Мобильный разработчик (React Native) — от 180 000 до 250 000 ₽, удалёнка

Android-разработчик Middle+ — до 250 000 ₽, удалёнка

IOS-разработчик (middle) — от 180 000 до 250 000 ₽, гибрид (Москва)

➡️ Еще больше топовых вакансий —‍ в нашем канале Mobile jobs

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

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

#свежак
Please open Telegram to view this post
VIEW IN 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
🔥1
Как найти деньги на создание игры?

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

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

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

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

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

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

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

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

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

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

Ссылка для регистрации (до 9 декабря):
https://clc.to/LojFzw