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 250
订阅者
-124 小时
-127
-2530
帖子存档
🤖 Запускаем новый курс: «Spec-Driven Development»! Всем надоело, что ИИ-агенты (Cursor, Claude) генерируют сотни строк хаоти
🤖 Запускаем новый курс: «Spec-Driven Development»! Всем надоело, что ИИ-агенты (Cursor, Claude) генерируют сотни строк хаотичного кода, который приходится переписывать. Дело не в нейросети, а в том, что вы заставляете её угадывать условия задачи. На курсе вы освоите методологию SDD (Spec-Driven Development) — управление ИИ через спецификации (спеки) и тесты вместо «вайб-кодинга». Как это работает? До генерации кода вы фиксируете в спеке контракты, инварианты и граничные случаи. Документ четко определяет ЧТО делать, сводя лотерею в PR к нулю. За 8 недель с экспертами из BigTech вы: 🔹 Встроите ИИ в личный или командный workflow. 🔹 Превратите генерацию кода в предсказуемый инженерный процесс. 🔹 Перестанете перепроверять за моделями каждую строчку. 📖 Полный разбор методологии с примерами и готовый промпт для генерации спеки — в нашей статье 👉 Освоить SDD и ускорить разработку

👀 Умеете строить предсказуемую архитектуру с ИИ? Станьте спикером 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

‼️ Срочный код-ревью Ребята, тут такое дело... Каналу нужен апрув на запуск сторис. Без вашего голоса фича не замержится в master. Ждем ваши +1 в виде нажатия на кнопку "Бустануть канал". Это займет 5 секунд, а нам очень поможет. По сути, это просто code review от вас. Кто первый заапрувит? 👇 ➡️ Бустануть канал 📌 Лучшие вакансии для мобильных разработчиков 🐸 Библиотека мобильного разработчика

🔝 Топ вакансий для мобильных разработчиков за неделю Android разработчик — от 350 000 ₽, удалёнка Android разработчик — удалёнка IOS-разработчик — от 190 000 ₽, офис/гибрид (Владивосток) Android разработчик — удалёнка/гибрид (Москва) iOS-разработчик — от 350 000 ₽, удалёнка/гибрид (Москва, Санкт-Петербург) ➡️ Еще больше топовых вакансий —‍ в нашем канале Mobile jobs 🐸 Библиотека мобильного разработчика #свежак

⚙️ SWCompression — работа с архивами на Swift SWCompression — фреймворк с алгоритмами (де)компрессии и функциями для работы с
⚙️ SWCompression — работа с архивами на Swift SWCompression — фреймворк с алгоритмами (де)компрессии и функциями для работы с различными архивами и контейнерами. Реализует: 🔵 Декомпрессия (а иногда и сжатие) с использованием различных алгоритмов 🔵 Чтение (а иногда и запись) архивов различных форматов 🔵 Чтение (а иногда и запись) контейнеров, таких как ZIP, TAR и 7-Zip Работает на платформах Apple, Linux и Windows. 💻 SWCompression на GitHub 📌 Лучшие вакансии для мобильных разработчиков 🐸 Библиотека мобильного разработчика #буст #Swift

⏰ Уже сегодня в 19:00 (МСК) стартует наш открытый урок! Знаем, летом хочется отложить учёбу на осень. Но пока остальные отдых
Уже сегодня в 19:00 (МСК) стартует наш открытый урок! Знаем, летом хочется отложить учёбу на осень. Но пока остальные отдыхают 😅, мы предлагаем без лишней конкуренции прокачать свой workflow и начать закрывать тикеты в три раза быстрее. Тема:
«AI-инструменты в разработке: пишем код быстрее»
Мы покажем живой разбор реального проекта: как с помощью AI-ассистентов мгновенно разбираться в чужой кодовой базе, искать нужные участки и собирать Pull Request. Только рабочие промпты, которые сэкономят вам часы рутины. 🎙 Спикер — Ольга Лукьянова, руководитель команды в SourceCraft (18+ лет развивала инструменты в JetBrains и Huawei). 👉 Узнать, как ускорить разработку с AI

🆕 Что нового в Swift 6.4 после WWDC26 Swift 6.4 включает в себя ряд улучшений языка и дополнений к стандартной библиотеке, к
🆕 Что нового в Swift 6.4 после WWDC26 Swift 6.4 включает в себя ряд улучшений языка и дополнений к стандартной библиотеке, которые делают повседневный код более чистым и выразительным. В этой статье рассматриваются наиболее заметные изменения, представленные на WWDC26. 👉 Читать статью 📌 Лучшие вакансии для мобильных разработчиков 🐸 Библиотека мобильного разработчика #свежак #Swift

Сабскрипты в 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

🗓 Новости недели Приготовили для вас дайджест по актуальному из мира iOS, Android и кроссплатформы. 🔵 Лучшие практики Swift
🗓 Новости недели Приготовили для вас дайджест по актуальному из мира iOS, Android и кроссплатформы. 🔵 Лучшие практики SwiftUI из агентского навыка Xcode 27 Агентский навык SwiftUI от Apple, поставляемый с Xcode 27, дает отличное представление о лучших практиках SwiftUI. Навык компактен и следует лучшим практикам, что, безусловно, приводит к улучшению кода SwiftUI в целом. 🔵 Android 17 официально вышел Android 17 — это не столько визуальное обновление, сколько серьёзное изменение правил разработки. 🔵 Когда таймлайн сам рисует кадры: встроенный ИИ‑генератор в MultiTrack 📌 Лучшие вакансии для мобильных разработчиков 🐸 Библиотека мобильного разработчика #свежак

📱 Адаптивные 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

🤖 Мы тут подготовили небольшую игру по ИИ-агентам В ней нужно собрать AI-агента на LangGraph: выбрать узлы, пройти развилки
🤖 Мы тут подготовили небольшую игру по ИИ-агентам В ней нужно собрать AI-агента на LangGraph: выбрать узлы, пройти развилки и запустить собственный workflow. Никакой теории — сразу практика. Можно наглядно увидеть, как работают агентные системы, проверьте свои знания или показать другим как это всё работает 🔥 🎁 За прохождение получите персональную скидку на курс. Чем больше баллов наберете — тем больше будет скидка. Плюс сейчас действует предложение: покупаешь 1 курс, получаешь еще 2 любых в подарок. Для этого надо будет оставить заявку на сайте академии после прохождения игры. 🚀 Собрать своего AI-агента

🤖 Используешь 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 (МСК) 👉 Занять место на открытом уроке

🎮 Асинхронная очистка с помощью 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

Почему аналитика может не отправляться?
Anonymous voting

Repost from N/a
Unikit открывает поиск co-founders в направление Unikit Apps 🪫 За последние годы рынок арбитража трафика значительно вырос.
Unikit открывает поиск co-founders в направление Unikit Apps 🪫 За последние годы рынок арбитража трафика значительно вырос. Вместе с этим вырос спрос на стабильную инфраструктуру, качественные приложения и команды, готовые играть «в долгую». В рамках масштабирования экосистемы Unikit мы запускаем отдельное направление мобильной разработки. Мы ищем не просто исполнителей, а стратегических партнеров для совместного развития юнита. Наши ресурсы для вашего старта: - Финансовая мотивация: до 80% от прибыли направления - Клиентская база: готовая инфраструктура и существующий поток входящих запросов - Технологии: работа через удобный формат MMP, доступ к продуктовой и технической экспертизе команды Unikit - Синергия: экосистема, которая позволяет кратно ускорить масштабирование. Если вы обладаете экспертизой в мобильной разработке и хотите построить масштабный продукт на базе готовой инфраструктуры, давайте обсудим детали. Контакт для связи: @unikit_support

⏰ Уже сегодня в 19:00 (МСК) стартует открытый урок! Тема:
«Мультиагентные системы: почему большинство архитектур переусложнены»
🔥 За 90 минут разберёмся, когда действительно стоит строить мультиагентную систему, а когда она только добавляет сложность, расходы и новые точки отказа. Поговорим о критериях выбора архитектуры, типичных ошибках и ограничениях современных ИИ-агентов, которые важно учитывать ещё до внедрения в продукт. 🎙️ Спикер — Дмитрий Юдин, руководитель AI/ML-направления в Сloud․ru. 🎁 Для всех участников подготовили промокод на скидку 10 000 ₽ на курс «Разработка ИИ-агентов». 👉 Успей присоединиться к уроку

🎁 Топ вакансий для мобильных разработчиков за неделю Android Developer Junior+/Middle — от 500 до 1 300 $, удалёнка iOS-разработчик — удалёнка/гибрид (Москва) Android Developer (Middle, Kotlin) — от 260 000 до 380 000 ₽, удалёнка/гибрид (Москва) IOS-разработчик (Middle) — гибрид/офис (Санкт-Петербург) ➡️ Еще больше топовых вакансий —‍ в нашем канале Mobile jobs 🐸 Библиотека мобильного разработчика #свежак