Библиотека мобильного разработчика | 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 |
پستهای کانال
Repost from Proglib.academy | IT-курсы
🫡 Один и тот же запрос к 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 весь экран? Создаёт ли заново все элементы интерфейса? Или под капотом происходит что-то более тонкое?
В этой статье автор шаг за шагом разберет эти вопросы и объяснит, что на самом деле представляет собой 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, построенный на основе 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 Concurrency
🔵 10 советов, как получить максимум от Claude Code в iOS-разработке
🔵 Топ-10 вопросов по Kotlin в 2026 году
🔵 Миграция с Flutter Web на Jaspr
🔵 Лучшая архитектура KMP-приложений и когда её не использовать
📌 Лучшие вакансии для мобильных разработчиков
🐸 Библиотека мобильного разработчика
#свежак | 532 |
| 10 | Какой паттерн проектирования активно используется в SwiftUI? | 571 |
| 11 | 🔥 Не называйте любого продвинутого чат-бота «ИИ-агентом»!
Дмитрий Юдин, руководитель AI/ML-направления в Сloud․ru, наглядно разбирает уровни абстракции ИИ-продуктов и убирает путаницу в понятиях.
Что внутри видео:
- Почему ассистент и агент принципиально разные сущности;
- Как ассистент может быть просто «обёрткой» над LLM, а может скрывать под капотом сложнейшую мультиагентную систему;
- Как понимать архитектуру глубже, чтобы проектировать сильные решения.
Начните создавать агентные системы с нашего бесплатного демо-урока. Всего за 2 часа разберем внутреннее устройство агента, научим его чинить свой собственный код и сохранять контекст после перезапуска.
🔗 Забрать бесплатный демо-урок | 585 |
| 12 | 🐸 Библиотека мобильного разработчика
#BugOrFeature | 518 |
| 13 | 🤨 Как заставить 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 августа пройдет хардкорный онлайн-интенсив для junior-middle разработчиков.
Формат: теория ➡️ сразу практика. Вы будете управлять AI-инструментами.
🛠️ Как всё пройдет:
День 1 (Суббота): разбираем анатомию агента, подключаем инструменты (shell, GitHub, Postgres) и дебажим трейсы.
День 2 (Воскресенье): собираем собственного агента под вашу задачу, настраиваем Eval + Guardrails (чтобы бот не галлюцинировал) и проводим демо.
Для кого: Вы пишете на Python, работаете с Git и терминалом. (С нуля не подойдет, темп очень быстрый!)
Артефакт на выходе: Рабочий репозиторий с вашим агентом, который не стыдно показать команде.
👨💻 Спикер: Алексей Жиряков (Сбер, GenAI).
Места ограничены!
👉 Изучить программу и занять место | 585 |
| 16 | ⚙️ 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 | 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 по МСК пройдет первое занятие нового потока, на которое может прийти каждый. Оцените пользу нашего подхода на ретрансляции урока в VK!
👨💻 Спикер: Андрей Носов
Тема: Архитектура управления: state machine для AI-агентов
Будем разбираться, как использовать State machine в качестве главного оружия против стохастики (непредсказуемости) LLM.
Что в программе:
● State machine: инварианты и терминальные состояния;
● Паттерны маршрутизации: Supervisor, ReAct, Plan-and-Solve;
● Детекция циклов и настройка аварийных выходов;
● Абстракция от модели: как сделать каркас, который переживет смену LLM/провайдера;
● Адаптация графов под ограничения локальных моделей;
● Версионирование графов и миграции стейта.
Результат занятия: Вы поймете, как спроектировать надежный каркас агента с жестким контролем исполнения и переходов.
👉 Подписывайтесь на нашу группу ВКонтакте, чтобы не пропустить старт трансляции! | 279 |
