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

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

@mobileproglib

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

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

Учиться у нас: clc.to/QSTQcA

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

РКН: https://gos
Subscribers
9.17K
Photos
2.1K
Videos
99
Links
5K

Showing posts older than #7095 · Back to latest

Older Posts 20 shown
Post #7094 860
‼️ Срочный код-ревью

Ребята, тут такое дело... Каналу нужен апрув на запуск сторис. Без вашего голоса фича не замержится в master.

Ждем ваши +1 в виде нажатия на кнопку "Бустануть канал". Это займет 5 секунд, а нам очень поможет.

По сути, это просто code review от вас. Кто первый заапрувит? 👇

➡️ Бустануть канал

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

🐸 Библиотека мобильного разработчика
Post #7093 860
🔝 Топ вакансий для мобильных разработчиков за неделю

Android разработчик — от 350 000 ₽, удалёнка

Android разработчик — удалёнка

IOS-разработчик — от 190 000 ₽, офис/гибрид (Владивосток)

Android разработчик — удалёнка/гибрид (Москва)

iOS-разработчик — от 350 000 ₽, удалёнка/гибрид (Москва, Санкт-Петербург)

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

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

#свежак
Post #7091 761
⚙️ SWCompression — работа с архивами на Swift

SWCompression — фреймворк с алгоритмами (де)компрессии и функциями для работы с различными архивами и контейнерами.

Реализует:

🔵 Декомпрессия (а иногда и сжатие) с использованием различных алгоритмов
🔵 Чтение (а иногда и запись) архивов различных форматов
🔵 Чтение (а иногда и запись) контейнеров, таких как ZIP, TAR и 7-Zip

Работает на платформах Apple, Linux и Windows.

💻 SWCompression на GitHub

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

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

#буст #Swift
Post #7090 764
Уже сегодня в 19:00 (МСК) стартует наш открытый урок!

Знаем, летом хочется отложить учёбу на осень. Но пока остальные отдыхают 😅, мы предлагаем без лишней конкуренции прокачать свой workflow и начать закрывать тикеты в три раза быстрее.

Тема:
«AI-инструменты в разработке: пишем код быстрее»


Мы покажем живой разбор реального проекта: как с помощью AI-ассистентов мгновенно разбираться в чужой кодовой базе, искать нужные участки и собирать Pull Request. Только рабочие промпты, которые сэкономят вам часы рутины.

🎙 Спикер — Ольга Лукьянова, руководитель команды в SourceCraft (18+ лет развивала инструменты в JetBrains и Huawei).

👉 Узнать, как ускорить разработку с AI
Post #7089 759
🆕 Что нового в Swift 6.4 после WWDC26

Swift 6.4 включает в себя ряд улучшений языка и дополнений к стандартной библиотеке, которые делают повседневный код более чистым и выразительным.

В этой статье рассматриваются наиболее заметные изменения, представленные на WWDC26.

👉 Читать статью

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

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

#свежак #Swift
Post #7088 618
Сабскрипты в 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
Post #7087 655
🗓 Новости недели

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

🔵 Лучшие практики SwiftUI из агентского навыка Xcode 27

Агентский навык SwiftUI от Apple, поставляемый с Xcode 27, дает отличное представление о лучших практиках SwiftUI. Навык компактен и следует лучшим практикам, что, безусловно, приводит к улучшению кода SwiftUI в целом.

🔵 Android 17 официально вышел

Android 17 — это не столько визуальное обновление, сколько серьёзное изменение правил разработки.

🔵 Когда таймлайн сам рисует кадры: встроенный ИИ‑генератор в MultiTrack

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

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

#свежак
Post #7086 661
📱 Адаптивные 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
Post #7085 707
🤖 Мы тут подготовили небольшую игру по ИИ-агентам

В ней нужно собрать AI-агента на LangGraph: выбрать узлы, пройти развилки и запустить собственный workflow.

Никакой теории — сразу практика. Можно наглядно увидеть, как работают агентные системы, проверьте свои знания или показать другим как это всё работает 🔥

🎁 За прохождение получите персональную скидку на курс. Чем больше баллов наберете — тем больше будет скидка.

Плюс сейчас действует предложение: покупаешь 1 курс, получаешь еще 2 любых в подарок. Для этого надо будет оставить заявку на сайте академии после прохождения игры.

🚀 Собрать своего AI-агента
Post #7083 764
🤖 Используешь AI для написания кода? В Яндексе покажут, как применять AI для реальных задач разработки.

23 июня в 19:00 совместно с Яндексом проведём открытый урок «AI-инструменты в разработке: как писать код быстрее с помощью ассистентов».

Спикер — Ольга Лукьянова, руководитель команды поиска и навигации по коду в SourceCraft. Более 18 лет развивала инструменты для разработчиков в JetBrains и руководила разработкой IDE в Huawei.

Что получишь на уроке:

— поймёшь, как использовать AI-ассистентов и облачных агентов в работе;
— научишься быстрее разбираться в новых проектах и кодовой базе;
— узнаешь, какие задачи стоит отдавать AI и как получать качественный результат;
— увидишь полный workflow работы с AI: от постановки задачи до код-ревью.

На уроке — живой разбор реального проекта с кодом. Ольга покажет промпты из рабочих сценариев и ответит на ваши вопросы в Q&A.

⚠️ Количество мест ограничено

🗓️ Когда: 23 июня, 19:00 (МСК)

👉 Занять место на открытом уроке
  • ❤ 1
Post #7082 712
🎮 Асинхронная очистка с помощью 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
Post #7078 732
⏰ Уже сегодня в 19:00 (МСК) стартует открытый урок!

Тема:

«Мультиагентные системы: почему большинство архитектур переусложнены»


🔥 За 90 минут разберёмся, когда действительно стоит строить мультиагентную систему, а когда она только добавляет сложность, расходы и новые точки отказа.

Поговорим о критериях выбора архитектуры, типичных ошибках и ограничениях современных ИИ-агентов, которые важно учитывать ещё до внедрения в продукт.

🎙️ Спикер — Дмитрий Юдин, руководитель AI/ML-направления в Сloud․ru.

🎁 Для всех участников подготовили промокод на скидку 10 000 ₽ на курс «Разработка ИИ-агентов».

👉 Успей присоединиться к уроку
Post #7077 756
🎁 Топ вакансий для мобильных разработчиков за неделю

Android Developer Junior+/Middle — от 500 до 1 300 $, удалёнка

iOS-разработчик — удалёнка/гибрид (Москва)

Android Developer (Middle, Kotlin) — от 260 000 до 380 000 ₽, удалёнка/гибрид (Москва)

IOS-разработчик (Middle)
гибрид/офис (Санкт-Петербург)

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

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

#свежак
Post #7075 841
Что такое tuple? Продемонстрируйте, как работать с ними

Tuple (кортеж) - это значение, которое можно использовать для объединения нескольких значений вместе, например, в виде пары.

Значения tuple не обязательно должны быть одного типа.

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

Например:

var coordinates3D = (1.0, 2.0, 5.0)


Чтобы получить доступ к значению внутри tuple, используйте точечную нотацию и индекс:

let xPos = coordinates3D.0


Кортежи также могут быть созданы таким образом, чтобы каждое значение имело имя:

var coordinates3D = (x: 1.0, y: 2.0, z: 5.0)


В этом случае вы можете получить доступ к определенному значению кортежа по его имени:

let xPos = coordinates3D.x


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

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

#буст #Swift
  • 👍 2
Post #7074 754
🗓 Новости недели

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

🔵 Что нового в SwiftUI после WWDC26

Эти улучшения делают SwiftUI более зрелым и дают нам ещё больше причин полагаться на него в production-приложениях.

🔵 RecyclerView. Оптимизация Adapter

В этой статье автор пройдет путь эволюции работы с RecyclerView.Adapter: разберет, как работает система уведомлений под капотом;
вспомнит, как DiffUtil и ListAdapter спасли нас от ручных вычислений; расскажет про AsyncListDiffer, ConcatAdapter и нюансы восстановления позиции; и наконец, покажет, как спроектировать универсальный адаптер с поддержкой разных ViewHolder, частичным обновлением (Payloads) и ViewBinding — с полным примером кода.

🔵 Приложение для изучения китайского. От идеи до прода

Автор поделиться своей историей выпуска Android-приложения для изучения китайского языка.

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

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

#свежак
  • 👍 1
Older posts →
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →