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 #7136 · Back to latest

Older Posts 20 shown
Post #7135 638
🚀 Уже завтра стартует новый поток курса «ИИ-агенты»!

Мы собрали мощнейший состав преподавателей. Учить вас проектировать архитектуру и собирать продакшн-агентов будут инженеры и исследователи из топовых IT-компаний.

Старт уже завтра!

Сомневаетесь, подойдет ли вам программа и подача? Начните с бесплатного демо-урока!

Всего за 2 часа вы заглянете под капот ИИ-агента, поймете, чем мышление модели отличается от ее ответа, и научите систему чинить собственный код. Это идеальный способ протестировать нашу платформу перед покупкой.

🔗 Пройти демо-урок и занять место на курсе
Post #7134 700
Чем Any в Kotlin отличается от Object в Java

Any не является полным аналогом java.lang.Object.

В Object 11 методов в классе, в Any только 3 методаequals()hashCode() и toString(). При импорте типов Java в Kotlin все ссылки типа java.lang.Object преобразуются в Any. Поскольку Any не зависит от платформы, он объявляет только toString()hashCode() и equals() в качестве своих членов, поэтому, чтобы сделать другие члены java.lang.Object доступными, Kotlin использует функции расширения.

Несмотря на то, что классы Object и Any имеют сходства (корневые классы иерархии классов), они также имеют и отличия, связанные с языковыми особенностями Kotlin и Java:

1️⃣ Класс Any в Kotlin является не только базовым классом для пользовательских классов, но также и супертипом для всех не-nullable типов данных, включая примитивные. В то время как в Java, класс Object является базовым классом только для пользовательских классов.

2️⃣ Класс Any в Kotlin также имеет nullable версию Any?, которая является супертипом для всех nullable типов данных в Kotlin. В то время как в Java, класс Object не имеет nullable версии.

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

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

#буст #Kotlin
Post #7133 719
Post #7131 759
🔥 Не называйте любого продвинутого чат-бота «ИИ-агентом»!

Дмитрий Юдин, руководитель AI/ML-направления в Сloud․ru, наглядно разбирает уровни абстракции ИИ-продуктов и убирает путаницу в понятиях.

Что внутри видео:

- Почему ассистент и агент принципиально разные сущности;
- Как ассистент может быть просто «обёрткой» над LLM, а может скрывать под капотом сложнейшую мультиагентную систему;
- Как понимать архитектуру глубже, чтобы проектировать сильные решения.

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

🔗 Забрать бесплатный демо-урок
Post #7129 705
🤨 Как заставить AI-агента не ломать архитектуру, а нормально писать код?

Мы привыкли общаться с ИИ промптами, но для автономных систем это путь к бесконечным циклам и сливу бюджета. Чтобы убрать хаос, инженеры переходят на Spec-Driven Development (SDD).

Вот как этот подход меняет работу агента на практике:

🔹Контракт вместо текста. Сначала пишется строгая спецификация (JSON-схема/OpenAPI) и автотесты. Агент зажат в рамки интерфейсов, за которые физически не может выйти.
🔹Контроль на шагах. Внутри петли Think-Act-Observe агент сверяет действия со спецификацией.
🔹Саморефлексия. Если ИИ нарушил типы или «додумал» лишнее, тест падает. Агент получает ошибку в контекст и сам правит код, не выходя за рамки ТЗ.

Это лишь база того, как укротить ИИ-разработку. Если вы хотите глубоко внедрить эту методологию, научиться проектировать архитектурные контракты и собирать отказоустойчивые системы — оставляйте заявку на наш новый курс по Spec-Driven Development. Стартуем совсем скоро🙂
  • ❤ 1
Post #7128 613
🎮 Image Playground Sheet в SwiftUI: как заменить ImageCreator

Когда Image Playground только появился, у разработчиков было два пути: показывать системный интерфейс или генерировать изображения программно через ImageCreator. Второй путь закрывается — Apple объявила ImageCreator deprecated. В iOS 27+ он перестанет работать.

Рекомендуемая альтернатива — системный модификатор imagePlaygroundSheet для SwiftUI.

🔹 Что делает imagePlaygroundSheet

Это модификатор, который показывает системный интерфейс Image Playground из вашего приложения. Вы даёте начальную идею (текст, структурированные концепты, опционально исходное изображение), а пользователь внутри шеста создаёт, редактирует и выбирает готовую картинку.

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

🔹 Базовое использование


import SwiftUI
import ImagePlayground

struct ContentView: View {
@State private var isPresented = false
@State private var generatedImageURL: URL?

var body: some View {
VStack(spacing: 16) {
if let generatedImageURL {
AsyncImage(url: generatedImageURL) { image in
image.resizable().scaledToFit()
} placeholder: {
ProgressView()
}
}

Button("Create image") {
isPresented = true
}
}
.imagePlaygroundSheet(
isPresented: $isPresented,
concept: "A small robot reading a Swift book",
sourceImage: nil,
onCompletion: { url in
generatedImageURL = url
},
onCancellation: {
print("Cancelled")
}
)
}
}


Модификатор ведёт себя как стандартные API презентации SwiftUI: вы управляете через биндинг, SwiftUI показывает шест, когда он true.

🔹 URL временный, нужно сохранять

URL, возвращаемый в onCompletion, указывает на временный файл. Для быстрого превью это ок, но если изображение становится частью данных приложения (аватар, иллюстрация, стикер, обложка) — его нужно сохранить.

private func persistGeneratedImage(from temporaryURL: URL) throws -> URL {
let fileName = "\(UUID().uuidString).png"
let destinationURL = URL.documentsDirectory.appending(path: fileName)

try FileManager.default.copyItem(at: temporaryURL, to: destinationURL)
return destinationURL
}

.imagePlaygroundSheet(
isPresented: $isPresented,
concept: "A small robot reading a Swift book",
sourceImage: nil,
onCompletion: { temporaryURL in
do {
generatedImageURL = try persistGeneratedImage(from: temporaryURL)
} catch {
print("Failed to save:", error)
}
},
onCancellation: {
print("Cancelled")
}
)


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

🔹 Проверка доступности


Image Playground доступен не везде. Зависит от версии ОС, устройства, Apple Intelligence и настроек пользователя. SwiftUI предоставляет окружение:

@Environment(\.supportsImagePlayground) private var supportsImagePlayground

var body: some View {
if supportsImagePlayground {
Button("Create image") { isPresented = true }
} else {
Text("Image Playground is not available")
}
}


🔹 Передача исходного изображения

Исходное изображение меняет сценарий: от «создай из текста» к «создай на основе этого».

.imagePlaygroundSheet(
isPresented: $isPresented,
concept: "Turn this into a soft illustrated avatar",
sourceImage: selectedImage,
onCompletion: { url in
generatedImageURL = url
}
)


Но помните: Image Playground — это интерактивный системный интерфейс. Исходное изображение даёт пользователю стартовую точку, а не строгий пайплайн трансформации.

🔹 Несколько концептов для большего контекста

Простая строка подходит для простых случаев, но Image Playground поддерживает структурированные концепты:

let concepts: [ImagePlaygroundConcept] = [
.text("Birthday postcard"),
.text("Warm evening light"),
.extracted(from: messageText, title: "Message")
]

.imagePlaygroundSheet(
isPresented: $isPresented,
concepts: concepts,
sourceImage: nil,
onCompletion: { url in
generatedImageURL = url
},
onCancellation: {
print("Cancelled")
}
)


Это полезно, когда идея для изображения собирается из нескольких частей приложения.

🔹 Итог

imagePlaygroundSheet — это не просто удобный модификатор. После deprecation ImageCreator он становится основным Apple-рекомендованным путём для приложений, которые хотят использовать Image Playground внутри своего интерфейса.

Вы даёте контекст — система показывает интерфейс создания — пользователь выбирает финальное изображение.

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

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

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

#PixelPerfect #Swift
Post #7127 697
🔥 ИИ-выходные: Собери своего AI-агента за 2 дня

Хватит просто читать про ИИ, пора собирать автономные системы руками! 1–2 августа пройдет хардкорный онлайн-интенсив для junior-middle разработчиков.

Формат: теория ➡️ сразу практика. Вы будете управлять AI-инструментами.

🛠️ Как всё пройдет:

День 1 (Суббота): разбираем анатомию агента, подключаем инструменты (shell, GitHub, Postgres) и дебажим трейсы.
День 2 (Воскресенье): собираем собственного агента под вашу задачу, настраиваем Eval + Guardrails (чтобы бот не галлюцинировал) и проводим демо.


Для кого: Вы пишете на Python, работаете с Git и терминалом. (С нуля не подойдет, темп очень быстрый!)

Артефакт на выходе: Рабочий репозиторий с вашим агентом, который не стыдно показать команде.
👨‍💻 Спикер: Алексей Жиряков (Сбер, GenAI).

Места ограничены!

👉 Изучить программу и занять место
  • 🥱 1
Post #7126 738
⚙️ LeanType — конфиденциальная клавиатура для Android

LeanType — это форк HeliBoard, клавиатура с открытым исходным кодом, ориентированная на конфиденциальность и возможность индивидуальной настройки, основанная на AOSP/OpenBoard.

Клавиатура предлагает гибридный подход: приватное, безопасное автономное ядро ​​для повседневной работы с текстом, а также мощные возможности искусственного интеллекта, доступные по вашему желанию.

💻 LeanType на GitHub

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

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

#буст #Android
Post #7125 731
🔝 Топ вакансий для мобильных разработчиков за неделю

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

IOS-разработчик — до 300 000 ₽, удалёнка

Android-разработчик — офис (Москва)

Flutter-разработчик — гибрид/офис (Москва)

Android Developer (Middle, Kotlin) — от 260 000 до 380 000 ₽, офис (Москва)

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

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

#свежак
  • 😁 1
Post #7123 716
Преобразование типов в Swift

При определении иерархии классов мы можем использовать объекты производного класса везде, где требуеются объекты базового класса. Например, следующие классы:

class Person{
    var name: String
    var age: Int
             
    init(name: String, age: Int){
        self.name = name
        self.age = age
    }
    func display(){
        print("Имя: \(name)  Возраст: \(age)")
    }
}
         
class Employee : Person{
    var company: String
    init(name: String, age: Int, company: String) {
        self.company = company
        super.init(name:name, age: age)
    }
    override func display(){
        print("Имя: \(name)  Возраст: \(age)  Сотрудник компании: \(company)")
    }
    func work(){
        print("\(self.name) работает")
    }
}


Поскольку класс Employee наследуется от класса Person, то везде, где требуется объект Person, мы можем использовать объект Employee:

func getInfo(p: Person){
    p.display()
}
         
let tom: Employee = Employee(name:"Tom", age: 23, company: "Google")
let bob: Person = Employee(name: "Bob", age: 28, company: "Apple")
 
getInfo(p: tom)     // Имя: Tom  Возраст: 23  Сотрудник компании: Google
getInfo(p: bob)     // Имя: Bob  Возраст: 28  Сотрудник компании: Apple


И в данном случае никаких ошибок не возникнет. И компилятор автоматически преобразует объекты Employee к типу Person.

Но теперь рассмотрим другую ситуацию:

let bob: Person = Employee(name: "Bob", age: 28, company: "Apple")
print(bob.company)      // ! Ошибка: у типа Person нет свойства company
bob.work()              // ! Ошибка: у типа Person нет метода work


В данном случае константа bob представляет тип Person, но хранит ссылку на объект Employee, у которого есть свойство company и метод work. Однако у типа Person их нет. И в данном случае константа bob воспринимается имеено объект Person, объект Person не обязательно должен представлять объект Employee.

Или другой пример:

func getInfo(p: Employee){
    p.display()
}
         
let bob: Person = Employee(name: "Bob", age: 28, company: "Apple")
getInfo(p: bob)     // ! Ошибка: bob представляет объект Person, а не Employee


Функция getInfo принимает объект Employee, однако константа bob представляет именно объект Person, несмотря на то, что хранит ссылку на объект Employee, поэтому автоматически мы ее передать в этот метод не можем.

🔹 Нисходящее преобразование

Что же делать, если переменная / константы представляет объект базового типа, однако нам необходимо его использовать как объект производного типа? В этом случае необходимо применить нисходящее преобразование типов (downcasting). Для этого применяется оператор as!:

func getInfo(p: Employee){
    p.display()
}
         
let bob: Person = Employee(name: "Bob", age: 28, company: "Apple")
         
print((bob as! Employee).company)       // Apple
         
(bob as! Employee).work()               // Bob работает
         
getInfo(p: (bob as! Employee))          // Имя: Bob  Возраст: 28  Сотрудник компании: Apple
 
let bobEmpl = bob as! Employee
bobEmpl.work()


🔹 Безопасное преобразование

Хотя оператор as! позволяет преобразовать объект одного типа в другой, тем не менее мы можем столкнуться с ошибкой:

let tom: Person = Person(name:"Tom", age: 23)
let tomEmpl: Employee = tom as! Employee


Здесь константа tom хранит ссылку на объект Person, а не Employee. Поэтому при попытке преобразования к типу Employee мы получим ошибку. Чтобы избежать подобных ошибок, следует проверять тип перед преобразованием типов с помощью оператора is:

let tom: Person = Person(name:"Tom", age: 23)
if tom is Employee{
    let tomEmpl: Employee = tom as! Employee
    tomEmpl.work()
}       
         
let bob: Person = Employee(name: "Bob", age: 28, company: "Apple")
if bob is Employee{
    let bobEmpl = bob as! Employee
    bobEmpl.work()
}


В качестве альтернативы мы можем преобразовывать объект в тип Optional с помощью оператора as?, а затем проверять на nil:

let tom: Person = Person(name:"Tom", age: 23)
 
let tomEmpl: Employee? = tom as? Employee
if tomEmpl != nil{
    tomEmpl!.work()
}       
         
let bob: Person = Employee(name: "Bob", age: 28, company: "Apple")
let bobEmpl = bob as? Employee
if bobEmpl != nil{
    bobEmpl!.work()
}


Также можно сократить код следующим образом с помощью оператора ?.:

let tom: Person = Person(name:"Tom", age: 23)
(tom as? Employee)?.work()
         
let bob: Person = Employee(name: "Bob", age: 28, company: "Apple")
(bob as? Employee)?.work()


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

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

#буст #Swift
Post #7121 688
🔥 Открытое занятие по AgentOps — курс стартовал!

Сегодня в 19:00 по МСК пройдет первое занятие нового потока, на которое может прийти каждый. Оцените пользу нашего подхода на ретрансляции урока в VK!

👨‍💻 Спикер: Андрей Носов

Тема: Архитектура управления: state machine для AI-агентов

Будем разбираться, как использовать State machine в качестве главного оружия против стохастики (непредсказуемости) LLM.

Что в программе:

● State machine: инварианты и терминальные состояния;
● Паттерны маршрутизации: Supervisor, ReAct, Plan-and-Solve;
● Детекция циклов и настройка аварийных выходов;
● Абстракция от модели: как сделать каркас, который переживет смену LLM/провайдера;
● Адаптация графов под ограничения локальных моделей;
● Версионирование графов и миграции стейта.

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

👉 Подписывайтесь на нашу группу ВКонтакте, чтобы не пропустить старт трансляции!
  • ❤ 1
Post #7120 760
🗓 Новости недели

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

🔵 Лента роликов на iOS: опыт работы с AVPlayer

Автор рассказывает, как команда Т-Банка улучшала пользовательский опыт и почему AVPlayer не лучшее решение для ленты роликов.

🔵 Навигация в Jetpack Compose без магии: что на самом деле делают библиотеки навигации

В статье автор разберёт, как работают библиотеки навигации в Jetpack Compose и какие задачи они решают на примере библиотеки навигации Modo.

🔵 Сборщик мусора в Dart. Часть 1: память и указатели

Эта статья — попытка автора объяснить доходчивым языком, что же такое Garbage Collector в Dart, объяснить почему эти некоторые знания нам нужны на практике и что из всей этой тяжелой, технической внутрянки вам необходимо знать.

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

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

#свежак
Post #7119 804
🦢 Проект Swift Package Index перешёл под управление Apple, а его разработчика взяли на работу в компанию

Apple объявила, что проект Swift Package Index стал частью экосистемы компании. Сооснователя и разработчика проекта устроили на работу в компанию. Теперь он займётся развитием Swift-пакетов в составе команды Apple.

Swift Package Index появился более пяти лет назад как независимый и открытый сервис для поиска, проверки и оценки совместимости Swift-библиотек. К 2026 году система индексирует более 10 тыс. пакетов, тестирует их на разных версиях Swift, публикует документацию и помогает разработчикам оценивать надёжность зависимостей. Например, в прошлом году проект выполнил более 3,5 млн проверок совместимости пакетов.

Сейчас же стало известно, что Swift Package Index становится частью экосистемы Apple. Компания обещает не закрывать код и продолжать работать в привычном режиме. Проект станет основой для полноценного реестра Swift-пакетов. В будущем появятся цифровые подписи пакетов, механизм подтверждения разработчиков и другие функции для обеспечения безопасности цепочки поставок.

Вместе с этим, сооснователь проекта Дэйв Вервер (Dave Verwer) перешёл в Apple. Он продолжит развивать Swift Package Index. Вервер уже обновил данные в LinkedIn, отметив, что теперь занимает должность Senior Developer Advocate в команде Swift Package Ecosystem.

Новость не была неожиданной для сообщества. Apple начала активно поддерживать проект ещё в 2023 году и стала спонсировать разработку. Ещё одним косвенным подтверждением перехода стало недавнее решение Вервера продать свою рассылку iOS Dev Weekly другим авторам. Всё дело в том, что Apple традиционно не поддерживает публичность своих сотрудников.

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

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

#свежак #iOS
  • ❤ 3
Post #7116 734
🎬 Как ИИ ускоряет разработку и где ломаются архитектуры

Мы провели открытый вебинар, где разобрали реальные боли проектирования автономных систем. Ольга Лукьянова на практическом кейсе показала, как использовать ИИ-ассистентов для реальных задач. Вы просили запись встречи — она уже в открытом доступе!

Что внутри:

— Как с помощью ИИ быстрее разбираться в незнакомом коде и готовить пулл-реквесты;
— Критерии выбора между одним агентом и мультиагентной системой;
— Разбор популярных архитектурных ошибок и ограничений современных ИИ;
— Практические рекомендации по проектированию и внедрению облачных агентов.

👉 Посмотреть полную запись можно тут:
VK
YouTube

🚀 Хотите пойти дальше открытого вебинара? Если вы готовы перейти от простых промптов к проектированию надежных, отказоустойчивых ИИ-систем, которые не сливают бюджет компании на API, приходите на курс AgentOps. Поток уже стартовал, но двери еще приоткрыты!

👉 Успеть на курс AgentOps
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 →