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

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

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

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

РКН: https://gosuslugi.ru/snet/67a4adec1b17b35b6c0d8389
Download Telegram
Media is too big
VIEW IN TELEGRAM
Быстрое ревью без запуска Android Studio и Xcode

Мобильные проекты часто отличаются глубокой вложенностью и сложными зависимостями. Чтобы качественно отревьюить PR, приходится запускать тяжелые IDE, ждать индексации Gradle или сборки проекта. Это убивает время.

SourceCraft предлагает альтернативу: умная навигация доступна прямо в браузере. Платформа понимает контекст, позволяет переходить к декларациям классов и методов, смотреть использования и типы переменных. Всё это работает мгновенно, не требуя локальной настройки окружения автора кода.

Оцените скорость работы инструмента → https://sourcecraft.dev/code-navigation-demo/uikit/pr/2040
👍2
🦢 Вопрос с собеседования по Swift

Можете ли вы определить перечисление с такими значениями? Почему?

enum Edges : (Double, Double) {
case TopLeft = (0.0, 0.0)
case TopRight = (1.0, 0.0)
case BottomLeft = (0.0, 1.0)
case BottomRight = (1.0, 1.0)
}


👇 Правильный ответ:

Нет, не можем. Тип значения должен:

• Соответствовать протоколу Equatable.
• Литерально преобразовываться из типов: Int, String, Character.

В приведенном выше коде это не соблюдено.


➡️ Щелкаешь такие задачи как орешки? Найди проект с достойной зарплатой тут

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

#междусобойчик
Please open Telegram to view this post
VIEW IN TELEGRAM
🎓 Твой опыт стоит дорого — стань экспертом Proglib Academy

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

Мы ищем сильных практиков, которые хотят попробовать себя в роли:

— преподавателей;
— авторов курсов;
— наставников.

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

👉 Заполни короткую анкету
👍1
Представьте: ваше приложение работает, пока пользователь спит

Не просто шлёт пуши, а реально решает задачи. Заказывает билеты, планирует встречи, анализирует расходы. Это работа для AI-агентов.

Чтобы вы могли внедрять фичи уровня 2026 года, мы кардинально обновили курс «Разработка AI-агентов».

Чем это круче старой версии?

📱 Гибкость: Два трека. Можно пройти «Обзорный», чтобы понимать архитектуру, или «Продвинутый», чтобы писать агентов самому.
📱 Стек: Вы научитесь работать с LangGraph и AutoGen — стандартами индустрии.
📱 Инфраструктура: Даем доступ к мощностям, чтобы обучать агентов, не перегревая локальную машину.

Это не просто «подключить ChatGPT». Это про создание автономных ассистентов внутри iOS и Android экосистем.

🎁 Акция 3 по цене 1:

Оплачиваете курс по агентам — выбираете еще два курса в подарок (хоть алгоритмы, хоть математику).

Подробности тут
👏1
🤖🔎 Подборка AI-инструментов для поиска работы в IT за рубежом

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

📌 Лучшие вакансии для мобильных разработчиков

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

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

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

🔵 Ускорение CI сборок в Xcode с кэшированием слотов

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

🔵 Улучшение доступности в Android-приложениях

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

🔵 Нейминг в Dart: полезные примеры из документации

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

📌 Лучшие вакансии для мобильных разработчиков

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

#свежак
Please open Telegram to view this post
VIEW IN TELEGRAM
Объявление объекта (object declaration), object как Singleton

Объявляется объект при помощи ключевого слова object, после которого следует имя объекта.

Файл, содержащий только object представляет из себя Singleton, т.е. будет создан только один экземпляр этого класса. Пример:

object One {
val cats = arrayListOf<Cat>()

fun callCat() {
for (cat in cats) {
...
}
}
}


Можно обращаться к методам и свойствам класса через имя объекта:

One.cats.add(Cat(...))
One.callCat()


Инициализация объявления объекта потокобезопасна и выполняется при первом доступе (лениво).

📌 Лучшие вакансии для мобильных разработчиков

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

#буст #JuniorKit #Kotlin
Please open Telegram to view this post
VIEW IN TELEGRAM
🔴 Как распознать нажатие на произвольную фигуру в Jetpack Compose

В Android-разработке определение нажатия на сложную нестандартную фигуру — нетривиальная задача. Класс Path не предоставляет готового API, а распространённые решения с проверкой пересечения маленького прямоугольника и фигуры — медленные и не всегда точные.

В Jetpack Compose есть простое и эффективное решение: PathHitTester.

🔹 Как это работает

1. Создайте хит-тестер, передав ему ваш Path:

val hitTester = PathHitTester(imagePath)


2. Проверяйте координаты нажатия с помощью метода contains(). Важно привести координаты касания к той же системе координат, что и путь:

val tap = down.position - imagePosition // Применяем обратное преобразование
val isTapped = tap in hitTester // Вызывает hitTester.contains(tap)


🔹 Ключевые особенности и преимущества

🔘 Точность: Определяет нажатие с точностью до пикселя.

🔘 Производительность: Использует специальную структуру данных для быстрой проверки, что позволяет использовать PathHitTester даже для обработки событий перетаскивания (drag) с высокой частотой.

🔘 Переиспользование: Чтобы обновить тестируемый путь, используйте метод update(newPath) вместо создания нового объекта.

🔹 Получение пути из изображения

В демонстрационном видео используется библиотека pathway. Её основная функция — генерация Path из Bitmap:

val contour = bitmap.toPath().asComposePath()


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

🔹 Итог

PathHitTester — это мощный и простой API Compose, который решает старую проблему детектирования нажатий на сложные фигуры. Он быстрый, точный и избавляет вас от необходимости писать громоздкие и ненадёжные костыли.

📌 Лучшие вакансии для мобильных разработчиков

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

#PixelPerfect #MiddlePath #Kotlin
Please open Telegram to view this post
VIEW IN TELEGRAM
⚙️ Snowdrop — простая работа с сетью

Snowdrop — типобезопасный, простой в использовании фреймворк на основе Swift Macros, созданный для того, чтобы вы могли с легкостью создавать и поддерживать сложные сетевые запросы.

Функции:

🔘 Создание типобезопасных сервисов с помощью макроса @Service
🔘 Поддержка различных типов методов запроса (например, @GET, @POST, @PUT, @DELETE, @PATCH, @CONNECT, @HEAD, @OPTIONS и т.п.)
🔘 Пиннинг SSL/сертификатов
🔘 Перехватчики
🔘 Возможность создания мок-объектов

💻 Snowdrop на GitHub

📌 Лучшие вакансии для мобильных разработчиков

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

#буст #iOS
Please open Telegram to view this post
VIEW IN TELEGRAM
🎮 Как избежать циклов сохранения при работе с задачами в Swift

Всякий раз, когда мы создаем задачу, например с помощью Task {}, Swift фиксирует все значения, на которые мы ссылаемся в теле задачи. По умолчанию эти фиксации являются сильными.

Это означает:

• Задача сохраняет захваченные значения до завершения задачи.
• Если мы захватываем self сильным захватом, а self также содержит ссылку на задачу, мы создаём цикл сохранения.
• Но важно отметить, что этот цикл длится только в течение времени существования задачи.

Давайте рассмотрим конкретный пример:

класс ImageLoader {
приватное поле task: Задача<Пустота, Никогда>?

func load() {
задача = Задача {
ожидание загрузка изображения()
}
}

func loadImage() async {
// ...
}
}


То, что здесь происходит, это:

• экземпляр ImageLoader строго удерживает задачу (поскольку задача является сохранённым свойством)
• задача строго удерживает своё замыкание
• замыкание строго удерживает self (поскольку мы вызываем downloadImages())

Таким образом, пока задача выполняется, у нас есть цикл сохранения:

ImageLoaderTaskImageLoader

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

Это означает:

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

Если мы хотим избежать даже этого временного цикла, мы можем использовать слабую ссылку на self с помощью [weak self], но для краткосрочных задач это обычно необязательно.

🔹 Там, где циклы сохранения приводят к утечкам памяти

Временные циклы сохранения редко становятся проблемой, но с постоянными циклами мы можем столкнуться с утечками памяти. Это происходит, когда выполняются все три условия:

1. Мы сохраняем задачу (как свойство).
2. Замыкание задачи сильно привязывает себя к ней.
3. Задача никогда не завершается или завершается намного позже, чем мы ожидаем.

Это может происходить в длительных циклах или при потоковой обработке:

класс MessageListener {
приватное поле task: Задача<Пустота, Никогда>?

func start() {
задача = Задача { [слабый я] в
for await сообщение in await сообщения .stream() {
guard let self else { return }
self.handle(message)
}
}
}

функция обработчик(_ сообщение: Сообщение) { }
}


В этом примере цикл может выполняться бесконечно. Без [weak self] задача сохраняет self в живых, а self сохраняет задачу в живых, образуя классический цикл сохранения.

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

📌 Лучшие вакансии для мобильных разработчиков

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

#АрхитектурныйКод #MiddlePath #Swift
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥31