Можете ли вы определить перечисление с такими значениями? Почему?
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
Please open Telegram to view this post
VIEW IN TELEGRAM
Представьте: ваше приложение работает, пока пользователь спит
Не просто шлёт пуши, а реально решает задачи. Заказывает билеты, планирует встречи, анализирует расходы. Это работа для AI-агентов.
Чтобы вы могли внедрять фичи уровня 2026 года, мы кардинально обновили курс «Разработка AI-агентов».
Чем это круче старой версии?
📱 Гибкость: Два трека. Можно пройти «Обзорный», чтобы понимать архитектуру, или «Продвинутый», чтобы писать агентов самому.
📱 Стек: Вы научитесь работать с
📱 Инфраструктура: Даем доступ к мощностям, чтобы обучать агентов, не перегревая локальную машину.
Это не просто «подключить ChatGPT». Это про создание автономных ассистентов внутри iOS и Android экосистем.
🎁 Акция 3 по цене 1:
Оплачиваете курс по агентам — выбираете еще два курса в подарок (хоть алгоритмы, хоть математику).
Подробности тут
Не просто шлёт пуши, а реально решает задачи. Заказывает билеты, планирует встречи, анализирует расходы. Это работа для AI-агентов.
Чтобы вы могли внедрять фичи уровня 2026 года, мы кардинально обновили курс «Разработка AI-агентов».
Чем это круче старой версии?
📱 Гибкость: Два трека. Можно пройти «Обзорный», чтобы понимать архитектуру, или «Продвинутый», чтобы писать агентов самому.
📱 Стек: Вы научитесь работать с
LangGraph и AutoGen — стандартами индустрии.📱 Инфраструктура: Даем доступ к мощностям, чтобы обучать агентов, не перегревая локальную машину.
Это не просто «подключить ChatGPT». Это про создание автономных ассистентов внутри iOS и Android экосистем.
🎁 Акция 3 по цене 1:
Оплачиваете курс по агентам — выбираете еще два курса в подарок (хоть алгоритмы, хоть математику).
Подробности тут
👏1
Please open Telegram to view this post
VIEW IN TELEGRAM
В карточках разобрали несколько инструментов, которые призваны оптимизировать поиск работы и позволят качественнее подготовиться к собеседованию.
#MadeInProglib
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
😁1
Приготовили для вас дайджест по актуальному из мира iOS, Android.
Далее следует полный технический анализ решения, которое автор в итоге реализовал, которое автор называет кэшированием с подогревом слотов.
Обеспечение корректного описания контента, удобных сенсорных областей и читаемого цветового контраста — это простые шаги, которые сделают наше приложение более доступным и удовлетворят потребности каждого пользователя.
Если вы и так являетесь приверженцем более декларативного и информативного нейминга в вашем коде, то эта статья покажет прям небольшие мелочи из официальной доки dart, которые позволят выкрутить читаемость на максимум.
#свежак
Please open Telegram to view this post
VIEW IN TELEGRAM
Объявляется объект при помощи ключевого слова
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
В 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) с высокой частотой.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 — типобезопасный, простой в использовании фреймворк на основе Swift Macros, созданный для того, чтобы вы могли с легкостью создавать и поддерживать сложные сетевые запросы.
Функции:
@Service@GET, @POST, @PUT, @DELETE, @PATCH, @CONNECT, @HEAD, @OPTIONS и т.п.)#буст #iOS
Please open Telegram to view this post
VIEW IN TELEGRAM
Всякий раз, когда мы создаем задачу, например с помощью
Task {}, Swift фиксирует все значения, на которые мы ссылаемся в теле задачи. По умолчанию эти фиксации являются сильными.Это означает:
• Задача сохраняет захваченные значения до завершения задачи.
• Если мы захватываем
self сильным захватом, а self также содержит ссылку на задачу, мы создаём цикл сохранения.• Но важно отметить, что этот цикл длится только в течение времени существования задачи.
Давайте рассмотрим конкретный пример:
класс ImageLoader {
приватное поле task: Задача<Пустота, Никогда>?
func load() {
задача = Задача {
ожидание загрузка изображения()
}
}
func loadImage() async {
// ...
}
}То, что здесь происходит, это:
• экземпляр
ImageLoader строго удерживает задачу (поскольку задача является сохранённым свойством)• задача строго удерживает своё замыкание
• замыкание строго удерживает
self (поскольку мы вызываем downloadImages())Таким образом, пока задача выполняется, у нас есть цикл сохранения:
ImageLoader → Task → ImageLoaderОднако у задач есть важное отличие от классических обработчиков сохранённых завершений: задача освобождает своё замыкание после завершения.
Это означает:
• В этом примере цикл длится ровно столько, сколько загружается изображение.
• Когда задача завершается, она отменяет своё закрытие и, следовательно, освобождает
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
🔥3❤1
Please open Telegram to view this post
VIEW IN TELEGRAM
😁3👏1
Middle iOS Developer — от 2 400 до 3 500 $, удалёнка
Android Developer — от $2 000 - $3 500, удалёнка
Senior iOS Developer — от 450 000 ₽, удалёнка
Kotlin Multiplatform/ Android разработчик — от 200 000 до 450 000 ₽, удалёнка/гибрид (Москва)
Senior iOS Developer — от 160 000 до 320 000₽, удалёнка
#свежак
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1