fa
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 216
مشترکین
+324 ساعت
-107 روز
-4330 روز

در حال بارگیری داده...

جذب مشترکین
ژوئیه '26
ژوئیه '26
+23
در 1 کانال‌ها
ژوئن '26
+48
در 1 کانال‌ها
Get PRO
مه '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 کانال‌ها
تاریخ
رشد مشترکین
اشارات
کانال‌ها
17 ژوئیه+1
16 ژوئیه+3
15 ژوئیه+2
14 ژوئیه+1
13 ژوئیه+1
12 ژوئیه0
11 ژوئیه+1
10 ژوئیه+1
09 ژوئیه0
08 ژوئیه0
07 ژوئیه+2
06 ژوئیه+3
05 ژوئیه+3
04 ژوئیه+1
03 ژوئیه+1
02 ژوئیه+2
01 ژوئیه+1
پست‌های کانال
🫡 Один и тот же запрос к AI можно выполнить двумя способами — и получить совершенно разный результат. 1️⃣ способ — просто по
🫡 Один и тот же запрос к AI можно выполнить двумя способами — и получить совершенно разный результат. 1️⃣ способ — просто попросить написать код. Модель может сгенерировать рабочее решение, но именно на этапе проверки часто всплывают пропущенные edge case’ы, ошибки обработки или проблемы с тестами. 2️⃣ способ — дать агенту цикл Think → Act → Observe. Он не останавливается после первой попытки: планирует действия, проверяет результат и, если находит ошибку, исправляет её и пробует снова. Самое интересное, что разница здесь не столько в модели ❕ Claude, GPT или другая LLM могут быть одинаковыми. Разницу создаёт инженерная система вокруг них. 📅 Именно это разберём 23 июля в 19:00 (МСК) на бесплатном вебинаре с Алексеем Жиряковым (Executive Director в Сбере, GenAI Data Platform, ex-CTO Stream и KION). На живом демо покажем, как один и тот же запрос работает без агентной системы и с ней 🔥 🔗 Регистрация 🏃‍♀️ Proglib Academy

2
🔥 Курс «Разработка ИИ-агентов» стартовал, но вы еще успеваете присоединиться! Мы только начали, а первый практический воркшо
🔥 Курс «Разработка ИИ-агентов» стартовал, но вы еще успеваете присоединиться! Мы только начали, а первый практический воркшоп пройдет только 23 июля. До этого времени вы спокойно успеете изучить материалы и нагнать группу. 💼 Главная фишка: финальный проект в портфолио: В финальном проекте вы сможете выбрать один из двух вариантов: реализовать свою идею или решить задачу от партнера курса — крупной российской финтех-компании. Вы будете работать с датасетом, построенным по реальным сценариям, получите бизнес-контекст и продовые ограничения. В результате соберете AI-агента, который станет сильным проектом для портфолио. 🎁 Упомяните менеджеру специальное предложение «3 курса по цене 1»: Берете VIP-тариф — получаете курс «Разработка ИИ-агентов», хардкорный «AgentOps» и ещё один курс на выбор. Выгода 129.000 ₽! Двери потока вот-вот закроются окончательно. Успейте забрать стек курсов и начать работу над реальным проектом 🔗 Занять место и забрать 3 курса
403
3
🔝 Топ вакансий для мобильных разработчиков за неделю Senior Flutter Developer — удалёнка Middle iOS Developer — офис (Ташкент) Android-разработчик / Kotlin Multiplatform — удалёнка/гибрид (Москва) IOS-разработчик — до 250 000 ₽, удалёнка ➡️ Еще больше топовых вакансий —‍ в нашем канале Mobile jobs 🐸 Библиотека мобильного разработчика #свежак
422
4
🦢 Что такое View в SwiftUI Что на самом деле происходит в SwiftUI при изменении состояния? Перерисовывает ли SwiftUI весь эк
🦢 Что такое View в SwiftUI Что на самом деле происходит в SwiftUI при изменении состояния? Перерисовывает ли SwiftUI весь экран? Создаёт ли заново все элементы интерфейса? Или под капотом происходит что-то более тонкое? В этой статье автор шаг за шагом разберет эти вопросы и объяснит, что на самом деле представляет собой SwiftUI.View, как работает some View, почему важен ViewBuilder и каким образом SwiftUI обновляет интерфейс при изменении состояния. 👉 Читать статью 📌 Лучшие вакансии для мобильных разработчиков 🐸 Библиотека мобильного разработчика #свежак #Swift
512
5
🔥 Стартуем СЕГОДНЯ! Новый поток курса «Разработка ИИ-агентов» открыт По этому поводу мы решили выложить закрытую запись одно
🔥 Стартуем СЕГОДНЯ! Новый поток курса «Разработка ИИ-агентов» открыт По этому поводу мы решили выложить закрытую запись одного из уроков из программы. Найти её в поиске YouTube нельзя — она доступна только по ссылке и всем, кто будет на курсе. Внутри глубокий разбор LLM от Алексея Яндутова (Senior ML-инженер, развивал ответы «Алисы» и «Нейро» в Яндексе). Учимся получать точный результат без галлюцинаций. Что внутри урока: - Устройство LLM. - Рабочие шаблоны промптов (Persona, Chain-of-Thought и др.). - Разбор реального кейса Яндекса. Как автоматизировать разметку, обойти качество людей на 5% и срезать косты на 60%. После просмотра вы поймете, когда хватает промпт-инжиниринга, а когда нужен RAG или fine-tuning. 👉Смотреть закрытый урок на YouTube Понравился урок? Переходите на новый уровень! Оставляйте заявку на курс, чтобы научиться проектировать надежные автономные системы. Обучение началось, но вы еще успеваете присоединиться. 🔗 Занять место на курсе
486
6
⚙️ LoopScroll — бесконечно прокручиваемая постраничная навигация LoopScroll — контрол для бесконечной прокрутки в iOS, постро
⚙️ LoopScroll — бесконечно прокручиваемая постраничная навигация LoopScroll — контрол для бесконечной прокрутки в iOS, построенный на основе UICollectionView. Поддерживает горизонтальную и вертикальную прокрутку, автоматическую прокрутку и привычный API делегата/источника данных. Особенности: 🔵 Бесконечная прокрутка — плавная перемотка элементов в обоих направлениях 🔵 Горизонтальная и вертикальная — переключение направления прокрутки с помощью одного свойства 🔵 Автоматическая прокрутка — настраиваемая автоматическая прокрутка на основе таймера 🔵 Привязка к странице — настраиваемая компоновка обеспечивает точную привязку к странице с учетом скорости нажатия 🔵 Источник данных и делегат — привычные протоколы в стиле UICollectionView 🔵 Совместимость с Objective-C — все публичные API доступны через @objc 🔵 Легковесный — нет внешних зависимостей, ~500 строк кода на Swift 💻 LoopScroll на GitHub 📌 Лучшие вакансии для мобильных разработчиков 🐸 Библиотека мобильного разработчика #буст #iOS
466
7
🚀 Уже завтра стартует новый поток курса «ИИ-агенты»! Мы собрали мощнейший состав преподавателей. Учить вас проектировать арх
🚀 Уже завтра стартует новый поток курса «ИИ-агенты»! Мы собрали мощнейший состав преподавателей. Учить вас проектировать архитектуру и собирать продакшн-агентов будут инженеры и исследователи из топовых IT-компаний. Старт уже завтра! Сомневаетесь, подойдет ли вам программа и подача? Начните с бесплатного демо-урока! Всего за 2 часа вы заглянете под капот ИИ-агента, поймете, чем мышление модели отличается от ее ответа, и научите систему чинить собственный код. Это идеальный способ протестировать нашу платформу перед покупкой. 🔗 Пройти демо-урок и занять место на курсе
478
8
❓ Чем 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
512
9
🗓 Новости недели Приготовили для вас дайджест по актуальному из мира iOS, Android и кроссплатформы. 🔵 Как сломать Swift Con
🗓 Новости недели Приготовили для вас дайджест по актуальному из мира iOS, Android и кроссплатформы. 🔵 Как сломать Swift Concurrency 🔵 10 советов, как получить максимум от Claude Code в iOS-разработке 🔵 Топ-10 вопросов по Kotlin в 2026 году 🔵 Миграция с Flutter Web на Jaspr 🔵 Лучшая архитектура KMP-приложений и когда её не использовать 📌 Лучшие вакансии для мобильных разработчиков 🐸 Библиотека мобильного разработчика #свежак
532
10
Какой паттерн проектирования активно используется в SwiftUI?
571
11
🔥 Не называйте любого продвинутого чат-бота «ИИ-агентом»! Дмитрий Юдин, руководитель AI/ML-направления в Сloud․ru, наглядно
🔥 Не называйте любого продвинутого чат-бота «ИИ-агентом»! Дмитрий Юдин, руководитель AI/ML-направления в Сloud․ru, наглядно разбирает уровни абстракции ИИ-продуктов и убирает путаницу в понятиях. Что внутри видео: - Почему ассистент и агент принципиально разные сущности; - Как ассистент может быть просто «обёрткой» над LLM, а может скрывать под капотом сложнейшую мультиагентную систему; - Как понимать архитектуру глубже, чтобы проектировать сильные решения. Начните создавать агентные системы с нашего бесплатного демо-урока. Всего за 2 часа разберем внутреннее устройство агента, научим его чинить свой собственный код и сохранять контекст после перезапуска. 🔗 Забрать бесплатный демо-урок
585
12
🐸 Библиотека мобильного разработчика #BugOrFeature
🐸 Библиотека мобильного разработчика #BugOrFeature
518
13
🤨 Как заставить AI-агента не ломать архитектуру, а нормально писать код? Мы привыкли общаться с ИИ промптами, но для автоном
🤨 Как заставить AI-агента не ломать архитектуру, а нормально писать код? Мы привыкли общаться с ИИ промптами, но для автономных систем это путь к бесконечным циклам и сливу бюджета. Чтобы убрать хаос, инженеры переходят на Spec-Driven Development (SDD). Вот как этот подход меняет работу агента на практике: 🔹Контракт вместо текста. Сначала пишется строгая спецификация (JSON-схема/OpenAPI) и автотесты. Агент зажат в рамки интерфейсов, за которые физически не может выйти. 🔹Контроль на шагах. Внутри петли Think-Act-Observe агент сверяет действия со спецификацией. 🔹Саморефлексия. Если ИИ нарушил типы или «додумал» лишнее, тест падает. Агент получает ошибку в контекст и сам правит код, не выходя за рамки ТЗ. Это лишь база того, как укротить ИИ-разработку. Если вы хотите глубоко внедрить эту методологию, научиться проектировать архитектурные контракты и собирать отказоустойчивые системы — оставляйте заявку на наш новый курс по Spec-Driven Development. Стартуем совсем скоро🙂
585
14
🎮 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
515
15
🔥 ИИ-выходные: Собери своего AI-агента за 2 дня Хватит просто читать про ИИ, пора собирать автономные системы руками! 1–2 ав
🔥 ИИ-выходные: Собери своего AI-агента за 2 дня Хватит просто читать про ИИ, пора собирать автономные системы руками! 1–2 августа пройдет хардкорный онлайн-интенсив для junior-middle разработчиков. Формат: теория ➡️ сразу практика. Вы будете управлять AI-инструментами. 🛠️ Как всё пройдет: День 1 (Суббота): разбираем анатомию агента, подключаем инструменты (shell, GitHub, Postgres) и дебажим трейсы. День 2 (Воскресенье): собираем собственного агента под вашу задачу, настраиваем Eval + Guardrails (чтобы бот не галлюцинировал) и проводим демо. Для кого: Вы пишете на Python, работаете с Git и терминалом. (С нуля не подойдет, темп очень быстрый!) Артефакт на выходе: Рабочий репозиторий с вашим агентом, который не стыдно показать команде. 👨‍💻 Спикер: Алексей Жиряков (Сбер, GenAI). Места ограничены! 👉 Изучить программу и занять место
585
16
⚙️ LeanType — конфиденциальная клавиатура для Android LeanType — это форк HeliBoard, клавиатура с открытым исходным кодом, ор
⚙️ LeanType — конфиденциальная клавиатура для Android LeanType — это форк HeliBoard, клавиатура с открытым исходным кодом, ориентированная на конфиденциальность и возможность индивидуальной настройки, основанная на AOSP/OpenBoard. Клавиатура предлагает гибридный подход: приватное, безопасное автономное ядро ​​для повседневной работы с текстом, а также мощные возможности искусственного интеллекта, доступные по вашему желанию. 💻 LeanType на GitHub 📌 Лучшие вакансии для мобильных разработчиков 🐸 Библиотека мобильного разработчика #буст #Android
631
17
🔝 Топ вакансий для мобильных разработчиков за неделю Android Developer (Middle, Kotlin) — от 260 000 до 380 000 ₽, гибрид (Москва) IOS-разработчик — до 300 000 ₽, удалёнка Android-разработчик — офис (Москва) Flutter-разработчик — гибрид/офис (Москва) Android Developer (Middle, Kotlin) — от 260 000 до 380 000 ₽, офис (Москва) ➡️ Еще больше топовых вакансий —‍ в нашем канале Mobile jobs 🐸 Библиотека мобильного разработчика #свежак
632
18
🐸 Библиотека мобильного разработчика #BugOrFeature
🐸 Библиотека мобильного разработчика #BugOrFeature
739
19
❓ Преобразование типов в 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
621
20
🔥 Открытое занятие по AgentOps — курс стартовал! Сегодня в 19:00 по МСК пройдет первое занятие нового потока, на которое мож
🔥 Открытое занятие по AgentOps — курс стартовал! Сегодня в 19:00 по МСК пройдет первое занятие нового потока, на которое может прийти каждый. Оцените пользу нашего подхода на ретрансляции урока в VK! 👨‍💻 Спикер: Андрей Носов Тема: Архитектура управления: state machine для AI-агентов Будем разбираться, как использовать State machine в качестве главного оружия против стохастики (непредсказуемости) LLM. Что в программе: ● State machine: инварианты и терминальные состояния; ● Паттерны маршрутизации: Supervisor, ReAct, Plan-and-Solve; ● Детекция циклов и настройка аварийных выходов; ● Абстракция от модели: как сделать каркас, который переживет смену LLM/провайдера; ● Адаптация графов под ограничения локальных моделей; ● Версионирование графов и миграции стейта. Результат занятия: Вы поймете, как спроектировать надежный каркас агента с жестким контролем исполнения и переходов. 👉 Подписывайтесь на нашу группу ВКонтакте, чтобы не пропустить старт трансляции!
279