ch
Feedback
Библиотека мобильного разработчика | Android, iOS, Swift, Retrofit, Moshi, Chuck

Библиотека мобильного разработчика | Android, iOS, Swift, Retrofit, Moshi, Chuck

前往频道在 Telegram

Все самое полезное для мобильного разработчика в одном канале. По рекламе: @proglib_adv Учиться у нас: clc.to/QSTQcA Для обратной связи: @proglibrary_feeedback_bot РКН: https://gos

显示更多
9 248
订阅者
-224 小时
-117
-4930
吸引订阅者
六月 '26
六月 '26
+44
在1个频道中
五月 '26
+73
在0个频道中
Get PRO
四月 '26
+52
在0个频道中
Get PRO
三月 '26
+78
在1个频道中
Get PRO
二月 '26
+111
在3个频道中
Get PRO
一月 '26
+79
在4个频道中
Get PRO
十二月 '25
+50
在1个频道中
Get PRO
十一月 '25
+37
在0个频道中
Get PRO
十月 '25
+63
在2个频道中
Get PRO
九月 '25
+61
在1个频道中
Get PRO
八月 '25
+78
在2个频道中
Get PRO
七月 '25
+71
在0个频道中
Get PRO
六月 '25
+42
在0个频道中
Get PRO
五月 '25
+58
在4个频道中
Get PRO
四月 '25
+85
在6个频道中
Get PRO
三月 '25
+143
在52个频道中
Get PRO
二月 '25
+130
在35个频道中
Get PRO
一月 '25
+101
在40个频道中
Get PRO
十二月 '24
+99
在36个频道中
Get PRO
十一月 '24
+135
在42个频道中
Get PRO
十月 '24
+183
在38个频道中
Get PRO
九月 '24
+112
在36个频道中
Get PRO
八月 '24
+109
在36个频道中
Get PRO
七月 '24
+186
在35个频道中
Get PRO
六月 '24
+152
在30个频道中
Get PRO
五月 '24
+307
在35个频道中
Get PRO
四月 '24
+294
在36个频道中
Get PRO
三月 '24
+372
在29个频道中
Get PRO
二月 '24
+389
在29个频道中
Get PRO
一月 '24
+507
在27个频道中
Get PRO
十二月 '23
+366
在26个频道中
Get PRO
十一月 '23
+176
在8个频道中
Get PRO
十月 '23
+428
在23个频道中
Get PRO
九月 '23
+400
在0个频道中
Get PRO
八月 '23
+415
在0个频道中
Get PRO
七月 '23
+411
在0个频道中
Get PRO
六月 '23
+290
在0个频道中
Get PRO
五月 '23
+420
在0个频道中
Get PRO
四月 '23
+277
在0个频道中
Get PRO
三月 '23
+654
在0个频道中
Get PRO
二月 '23
+195
在0个频道中
Get PRO
一月 '23
+190
在0个频道中
Get PRO
十二月 '22
+217
在0个频道中
Get PRO
十一月 '22
+229
在0个频道中
Get PRO
十月 '22
+108
在0个频道中
Get PRO
九月 '22
+140
在0个频道中
Get PRO
八月 '22
+198
在0个频道中
Get PRO
七月 '22
+242
在0个频道中
Get PRO
六月 '22
+189
在0个频道中
Get PRO
五月 '22
+85
在0个频道中
Get PRO
四月 '22
+68
在0个频道中
Get PRO
三月 '22
+138
在0个频道中
Get PRO
二月 '22
+75
在0个频道中
Get PRO
一月 '22
+120
在0个频道中
Get PRO
十二月 '21
+162
在0个频道中
Get PRO
十一月 '21
+142
在0个频道中
Get PRO
十月 '21
+142
在0个频道中
Get PRO
九月 '21
+150
在0个频道中
Get PRO
八月 '21
+206
在0个频道中
Get PRO
七月 '21
+200
在0个频道中
Get PRO
六月 '21
+129
在0个频道中
Get PRO
五月 '21
+311
在0个频道中
Get PRO
四月 '21
+304
在0个频道中
Get PRO
三月 '21
+209
在0个频道中
Get PRO
二月 '21
+206
在0个频道中
Get PRO
一月 '21
+178
在0个频道中
Get PRO
十二月 '20
+6 962
在0个频道中
日期
订阅者增长
提及
频道
28 六月+1
27 六月+3
26 六月+3
25 六月+1
24 六月+2
23 六月+1
22 六月+2
21 六月0
20 六月+2
19 六月+2
18 六月+2
17 六月+5
16 六月0
15 六月0
14 六月+2
13 六月+1
12 六月0
11 六月+1
10 六月+1
09 六月+2
08 六月+3
07 六月+1
06 六月+2
05 六月+2
04 六月+2
03 六月+2
02 六月0
01 六月+1
频道帖子
2
🐸 Библиотека мобильного разработчика #междусобойчик #JuniorKit #Swift
🐸 Библиотека мобильного разработчика #междусобойчик #JuniorKit #Swift
315
3
Что выведет код?
296
4
🎬 Где ломаются архитектуры ИИ-агентов и как этого избежать: запись урока от Proglib.Academy и cloud․ru Proglib.аcademy вмест
🎬 Где ломаются архитектуры ИИ-агентов и как этого избежать: запись урока от Proglib.Academy и cloud․ru Proglib.аcademy вместе с cloud․ru провели вебинар, где разобрали реальные боли проектирования автономных систем. Вы просили запись встречи — она уже в открытом доступе! Что внутри: — критерии выбора между одним агентом и мультиагентной системой; — разбор популярных архитектурных ошибок; — реальные ограничения современных ИИ-агентов; — практические рекомендации по проектированию агентных систем. 👉 Посмотреть запись можно тут: ● VK ● YouTube
348
5
👾 Ручной DI в Kotlin Multiplatform Граф зависимостей KMP‑приложения можно собрать обычным Kotlin‑кодом — без рефлексии, кодо
👾 Ручной DI в Kotlin Multiplatform Граф зависимостей KMP‑приложения можно собрать обычным Kotlin‑кодом — без рефлексии, кодогенерации, аннотаций и DSL. Composition root и конструкторы, никакой магии. Звучит как шаг назад от зрелых DI‑фреймворков — пока не посмотришь, кому такая форма удобна: тебе, новому человеку в команде и твоему ИИ‑агенту. 👉 Читать статью 📌 Лучшие вакансии для мобильных разработчиков 🐸 Библиотека мобильного разработчика #свежак #Kotlin
421
6
🤖 Запускаем новый курс: «Spec-Driven Development»! Всем надоело, что ИИ-агенты (Cursor, Claude) генерируют сотни строк хаоти
🤖 Запускаем новый курс: «Spec-Driven Development»! Всем надоело, что ИИ-агенты (Cursor, Claude) генерируют сотни строк хаотичного кода, который приходится переписывать. Дело не в нейросети, а в том, что вы заставляете её угадывать условия задачи. На курсе вы освоите методологию SDD (Spec-Driven Development) — управление ИИ через спецификации (спеки) и тесты вместо «вайб-кодинга». Как это работает? До генерации кода вы фиксируете в спеке контракты, инварианты и граничные случаи. Документ четко определяет ЧТО делать, сводя лотерею в PR к нулю. За 8 недель с экспертами из BigTech вы: 🔹 Встроите ИИ в личный или командный workflow. 🔹 Превратите генерацию кода в предсказуемый инженерный процесс. 🔹 Перестанете перепроверять за моделями каждую строчку. 📖 Полный разбор методологии с примерами и готовый промпт для генерации спеки — в нашей статье 👉 Освоить SDD и ускорить разработку
481
7
👀 Умеете строить предсказуемую архитектуру с ИИ? Станьте спикером Proglib academy Мы в Proglib.academy запускаем курс по Spe
👀 Умеете строить предсказуемую архитектуру с ИИ? Станьте спикером Proglib academy Мы в Proglib.academy запускаем курс по Spec-Driven Development (SDD) — учим разработчиков управлять ИИ-агентами (Cursor, Copilot, Claude) через спецификации, контекст и тесты, чтобы не перепроверять за нейросетью каждую строку. Для этого курса мы ищем классных спикеров-практиков. ➡️ Что требуется от вас? ● BigTech бэкграунд: опыт работы разработчиком, тимлидом или архитектором в крупных технологических компаниях. ● Опыт управляемой разработки с ИИ: вы на практике знаете, как встроить AI-инструменты в личный или командный workflow (от постановки задачи до ревью AI-кода). ● Системный подход: умение превращать хаотичную генерацию кода в предсказуемый инженерный процесс (работа с архитектурой, чек-листами, легаси и покрытием тестами). ➡️ Что мы предлагаем? ● Достойную оплату за подготовку материалов и проведение занятий. ● Мощное продвижение личного бренда через медиаресурсы Proglib (наша аудитория — 1 млн+ айтишников). ● Возможность публиковать свои экспертные материалы и статьи на наших площадках. ● Доступ к сильному и закрытому профессиональному сообществу. Также мы ищем консультанта программы. Если вы практикующий эксперт и готовы помочь нам отвалидировать программу курса, дать рекомендации по актуальности тем и финальным результатам обучения — мы вас очень ждем. ➡️ Как с нами связаться: Telegram: @alinaa_kh E-mail: alina@proglib.io
507
8
‼️ Срочный код-ревью Ребята, тут такое дело... Каналу нужен апрув на запуск сторис. Без вашего голоса фича не замержится в master. Ждем ваши +1 в виде нажатия на кнопку "Бустануть канал". Это займет 5 секунд, а нам очень поможет. По сути, это просто code review от вас. Кто первый заапрувит? 👇 ➡️ Бустануть канал 📌 Лучшие вакансии для мобильных разработчиков 🐸 Библиотека мобильного разработчика
633
9
🔝 Топ вакансий для мобильных разработчиков за неделю Android разработчик — от 350 000 ₽, удалёнка Android разработчик — удалёнка IOS-разработчик — от 190 000 ₽, офис/гибрид (Владивосток) Android разработчик — удалёнка/гибрид (Москва) iOS-разработчик — от 350 000 ₽, удалёнка/гибрид (Москва, Санкт-Петербург) ➡️ Еще больше топовых вакансий —‍ в нашем канале Mobile jobs 🐸 Библиотека мобильного разработчика #свежак
637
10
🐸 Библиотека мобильного разработчика #BugOrFeature
🐸 Библиотека мобильного разработчика #BugOrFeature
612
11
⚙️ SWCompression — работа с архивами на Swift SWCompression — фреймворк с алгоритмами (де)компрессии и функциями для работы с
⚙️ SWCompression — работа с архивами на Swift SWCompression — фреймворк с алгоритмами (де)компрессии и функциями для работы с различными архивами и контейнерами. Реализует: 🔵 Декомпрессия (а иногда и сжатие) с использованием различных алгоритмов 🔵 Чтение (а иногда и запись) архивов различных форматов 🔵 Чтение (а иногда и запись) контейнеров, таких как ZIP, TAR и 7-Zip Работает на платформах Apple, Linux и Windows. 💻 SWCompression на GitHub 📌 Лучшие вакансии для мобильных разработчиков 🐸 Библиотека мобильного разработчика #буст #Swift
588
12
⏰ Уже сегодня в 19:00 (МСК) стартует наш открытый урок! Знаем, летом хочется отложить учёбу на осень. Но пока остальные отдых
⏰ Уже сегодня в 19:00 (МСК) стартует наш открытый урок! Знаем, летом хочется отложить учёбу на осень. Но пока остальные отдыхают 😅, мы предлагаем без лишней конкуренции прокачать свой workflow и начать закрывать тикеты в три раза быстрее. Тема: «AI-инструменты в разработке: пишем код быстрее» Мы покажем живой разбор реального проекта: как с помощью AI-ассистентов мгновенно разбираться в чужой кодовой базе, искать нужные участки и собирать Pull Request. Только рабочие промпты, которые сэкономят вам часы рутины. 🎙 Спикер — Ольга Лукьянова, руководитель команды в SourceCraft (18+ лет развивала инструменты в JetBrains и Huawei). 👉 Узнать, как ускорить разработку с AI
559
13
🆕 Что нового в Swift 6.4 после WWDC26 Swift 6.4 включает в себя ряд улучшений языка и дополнений к стандартной библиотеке, к
🆕 Что нового в Swift 6.4 после WWDC26 Swift 6.4 включает в себя ряд улучшений языка и дополнений к стандартной библиотеке, которые делают повседневный код более чистым и выразительным. В этой статье рассматриваются наиболее заметные изменения, представленные на WWDC26. 👉 Читать статью 📌 Лучшие вакансии для мобильных разработчиков 🐸 Библиотека мобильного разработчика #свежак #Swift
642
14
❓ Сабскрипты в Swift Классы, структуры и перечисления могут определять сабскрипты (subscripts). Сабскрипты используются для доступа к элементам коллекции или последовательности. В ряде языков программирования есть похожая концепция - индексаторы. Сабскрипты позволяют обращаться с объектом класса или структуры как с отдельной коллекцией. Для определения сабскрипта используется ключевое слово subscript: subscript(параметры) -> тип_возвращаемых_объектов {           get {                   // возвращаем значение     }     set(newValue) {                   // устанавливаем новое значение newValue     } } После ключевого слова subscript в скобках идут параметры, которые используются для получения элементов. Нередко параметры представляют числовой индекс, по которому надо получить объект. Далее указывается тип элементов, с которыми мы работаем. Сабскрипт может состоять из двух блоков: get и set. Блок get возвращает элемент, а блок set устанавливает новое значение, которое передается через параметр newValue. Например, создадим класс библиотеки. Упрощенно библиотека представляет некоторый набор книг. То есть мы можем представить класс библиотеки как коллекцию книг и использовать сабскрипты для получения книг по индексу: class Book{     // класс книги           var name: String     init(name: String){                   self.name = name     } } class Library{      // класс библиотеки           var books: [Book] = [Book]()           init(){                   books.append(Book(name: "Война и мир"))         books.append(Book(name: "Отцы и дети"))         books.append(Book(name: "Чайка"))     }           subscript(index: Int) -> Book{                   get{             return books[index]         }         set(newValue){             books[index] = newValue         }     } }   var myLibrary: Library = Library() var firstBook: Book = myLibrary[0]  // получаем элемент по индексу 0 print(firstBook.name)   // Война и мир   myLibrary[2] = Book(name: "Мартин Иден")    // установка элемента по индексу 2 print(myLibrary[2].name)    // Мартин Иден Здесь сабскрипт предназначен для работы с типом Book. В блоке get происходит получение объекта Book по индексу из массива books. В блоке set устанавливаем объект Book в массиве books. В итоге в программе мы сможем обращаться к библиотеке как к массиву по индексу для получения нужной книги: var firstBook: Book = myLibrary[0] Есть два типа сабскриптов: 🔵 Сабскрипты, которые поддерживают чтение и запись (то есть с блоками get и set, как в примере выше) 🔵 Сабскрипты только для чтения (только с блоком get) Изменим класс библиотеки, чтобы применить сабскрипт только для чтения: class Library{           var books: [Book] = [Book]()           init(){                   books.append(Book(name: "Война и мир"))         books.append(Book(name: "Отцы и дети"))         books.append(Book(name: "Чайка"))     }           subscript(index: Int) -> Book{                   return books[index]     } } 📌 Лучшие вакансии для мобильных разработчиков 🐸 Библиотека мобильного разработчика #буст #JuniorKit #Swift
523
15
🗓 Новости недели Приготовили для вас дайджест по актуальному из мира iOS, Android и кроссплатформы. 🔵 Лучшие практики Swift
🗓 Новости недели Приготовили для вас дайджест по актуальному из мира iOS, Android и кроссплатформы. 🔵 Лучшие практики SwiftUI из агентского навыка Xcode 27 Агентский навык SwiftUI от Apple, поставляемый с Xcode 27, дает отличное представление о лучших практиках SwiftUI. Навык компактен и следует лучшим практикам, что, безусловно, приводит к улучшению кода SwiftUI в целом. 🔵 Android 17 официально вышел Android 17 — это не столько визуальное обновление, сколько серьёзное изменение правил разработки. 🔵 Когда таймлайн сам рисует кадры: встроенный ИИ‑генератор в MultiTrack 📌 Лучшие вакансии для мобильных разработчиков 🐸 Библиотека мобильного разработчика #свежак
555
16
📱 Адаптивные TabView с .tabViewStyle(.sidebarAdaptable) в SwiftUI Раньше TabView на iPhone выглядела как нижний таб-бар, а на iPad хотелось чего-то более похожего на сайдбар: больше пространства, группировка пунктов, удобство на большом экране. Обычно приходилось строить кастомный сайдбар, разделять навигацию на отдельные структуры или писать условный код под каждую платформу. .tabViewStyle(.sidebarAdaptable) меняет этот подход. Теперь TabView может адаптироваться между таб-баром и сайдбаром, оставаясь в рамках стандартного SwiftUI API. Дополнительный модификатор .defaultTabBarPlacement(.sidebar) даёт ещё один рычаг управления, позволяя предпочесть сайдбар для табов, когда используется адаптивный стиль. 🔹 Основная идея API начинается с обычного TabView: struct RootView: View { var body: some View { TabView { Tab("Home", systemImage: "house") { HomeView() } Tab("Library", systemImage: "books.vertical") { LibraryView() } Tab("Search", systemImage: "magnifyingglass") { SearchView() } } .tabViewStyle(.sidebarAdaptable) } } Вы не заменяете TabView кастомным контейнером. Вы описываете места назначения один раз, а SwiftUI решает, как их представить: на iPhone это привычный таб-бар, на iPad — сайдбар. 🔹 Где применяется .defaultTabBarPlacement(.sidebar) .sidebarAdaptable включает адаптивный стиль. .defaultTabBarPlacement(.sidebar) сообщает SwiftUI, какое размещение предпочтительнее по умолчанию: .tabViewStyle(.sidebarAdaptable) .defaultTabBarPlacement(.sidebar) Таким образом, когда TabView может использовать адаптивный стиль, он начинает с сайдбара. Поведение всё ещё контролируется SwiftUI. 🧭 Важная деталь: NavigationStack Кнопка сайдбара появляется в области навигации. Если таб содержит простое вью без навигационного контейнера, у SwiftUI может не быть видимой навигационной панели для размещения этого контрола. Поэтому в реальном приложении каждый таб должен иметь собственный NavigationStack и предоставлять navigationTitle: struct RootView: View { var body: some View { TabView { Tab("Dashboard", systemImage: "speedometer") { NavigationStack { List { Text("View Reports") Text("Check Tasks") Text("Team Activity") } .navigationTitle("Dashboard") } } Tab("Messages", systemImage: "bubble.left.and.bubble.right") { NavigationStack { List(["Alice", "Bob", "Charlie"], id: \.self) { name in NavigationLink { Text("Chat with \(name)") } label: { Text(name) } } .navigationTitle("Messages") } } } .tabViewStyle(.sidebarAdaptable) .defaultTabBarPlacement(.sidebar) } } 🔹 Почему это полезно На iPad нижний таб-бар часто выглядит как паттерн с iPhone, перенесённый на большой экран. Сайдбар даёт больше места для меток, лучше группирует пункты и снимает ограничение "впихнуть всё в 4–5 табов". Кроме того, у этой API есть ещё один интересный аспект. Если Apple когда-нибудь выпустит складной iPhone, граница между iPhone и iPad перестанет быть чёткой. Закрытое устройство может вести себя как обычный iPhone, а развёрнутое — иметь пространство для сайдбара. Apple пока не анонсировала такое устройство, но направление этого API отлично вписывается в такое будущее. Складной iPhone потребует приложений, которые могут переключаться между компактными и расширенными лейаутами без создания отдельной навигационной системы для каждого разработчика. TabView с .sidebarAdaptable — именно то API, которое в этом помогает. Мне больше всего нравится в этом API то, что он не заставляет вас предугадывать каждую форму устройства. 🔹 Итог .tabViewStyle(.sidebarAdaptable) решает реальную проблему компоновки. Он позволяет SwiftUI использовать одну и ту же модель табов как в компактных, так и в расширенных интерфейсах. .defaultTabBarPlacement(.sidebar) добавляет небольшое, но полезное предпочтение поверх этой модели. Для iPad-приложений это уже имеет смысл. Для возможного складного iPhone это может стать ещё более важным. 📌 Лучшие вакансии для мобильных разработчиков 🐸 Библиотека мобильного разработчика #PixelPerfect #Swift
543
17
🤖 Мы тут подготовили небольшую игру по ИИ-агентам В ней нужно собрать AI-агента на LangGraph: выбрать узлы, пройти развилки
🤖 Мы тут подготовили небольшую игру по ИИ-агентам В ней нужно собрать AI-агента на LangGraph: выбрать узлы, пройти развилки и запустить собственный workflow. Никакой теории — сразу практика. Можно наглядно увидеть, как работают агентные системы, проверьте свои знания или показать другим как это всё работает 🔥 🎁 За прохождение получите персональную скидку на курс. Чем больше баллов наберете — тем больше будет скидка. Плюс сейчас действует предложение: покупаешь 1 курс, получаешь еще 2 любых в подарок. Для этого надо будет оставить заявку на сайте академии после прохождения игры. 🚀 Собрать своего AI-агента
602
18
🐸 Библиотека мобильного разработчика #BugOrFeature
🐸 Библиотека мобильного разработчика #BugOrFeature
624
19
🤖 Используешь AI для написания кода? В Яндексе покажут, как применять AI для реальных задач разработки. 23 июня в 19:00 совм
🤖 Используешь AI для написания кода? В Яндексе покажут, как применять AI для реальных задач разработки. 23 июня в 19:00 совместно с Яндексом проведём открытый урок «AI-инструменты в разработке: как писать код быстрее с помощью ассистентов». Спикер — Ольга Лукьянова, руководитель команды поиска и навигации по коду в SourceCraft. Более 18 лет развивала инструменты для разработчиков в JetBrains и руководила разработкой IDE в Huawei. Что получишь на уроке: — поймёшь, как использовать AI-ассистентов и облачных агентов в работе; — научишься быстрее разбираться в новых проектах и кодовой базе; — узнаешь, какие задачи стоит отдавать AI и как получать качественный результат; — увидишь полный workflow работы с AI: от постановки задачи до код-ревью. На уроке — живой разбор реального проекта с кодом. Ольга покажет промпты из рабочих сценариев и ответит на ваши вопросы в Q&A. ⚠️ Количество мест ограничено 🗓️ Когда: 23 июня, 19:00 (МСК) 👉 Занять место на открытом уроке
672
20
🎮 Асинхронная очистка с помощью defer в Swift Оператор defer Swift полезен для логики очистки. Он гарантирует, что блок кода будет выполнен при выходе из текущей области видимости, независимо от того, завершится ли выполнение нормально, возникнет ли ошибка или произойдет досрочный возврат. До выхода Swift 6.4 мы не могли выполнять асинхронные операции непосредственно внутри блока defer. Начиная с версии Swift 6.4 это стало возможным. 🔹 Ограничения defer без поддержки async Рассмотрим функцию, которая открывает ресурс и должна закрыть его после завершения работы: func processFile() async throws { let file = try await openFile() defer { file.close() } try await process(file) } Это работает, только если очистка выполняется синхронно. Однако многие современные API являются асинхронными. Если для закрытия файла требуется await, приведенный выше код не сработает: defer { await file.close() // Ошибка компилятора в Swift версии < 6.4 } Чтобы устранить ошибку компилятора, нам пришлось перенести логику очистки в другое место: let file = try await openFile() do { try await process(file) await file.close() } catch { await file.close() throw error } Помимо дублирования кода, это делает логику очистки менее очевидной, поскольку она отделена от получения ресурса. 🔹 Асинхронная очистка с помощью defer Благодаря поддержке асинхронных операций с помощью defer мы можем расположить получение и очистку ресурсов рядом друг с другом: func processFile() async throws { let file = try await openFile() defer { await file.close() } try await process(file) } Теперь операция очистки гарантированно выполняется при выходе из области видимости, но при этом поддерживается асинхронная работа. 🔹 Примечание по изоляции акторов| Блок defer наследует изоляцию актора от охватывающей его области видимости. Если окружающая функция выполняется на @MainActor, код очистки внутри defer также выполняется на @MainActor. 📌 Лучшие вакансии для мобильных разработчиков 🐸 Библиотека мобильного разработчика #АрхитектурныйКод #Swift
636