AnyLanguageModel — пакет Swift, предоставляющий готовую замену фреймворку Apple Foundation Models с поддержкой кастомных моделей. Всё, что вам нужно сделать, — это изменить оператор импорта:
— import FoundationModels
+ import AnyLanguageModel
struct WeatherTool: Tool {
let name = "getWeather"
let denoscription = "Retrieve the latest weather information for a city"
@Generable
struct Arguments {
@Guide(denoscription: "The city to fetch the weather for")
var city: String
}
func call(arguments: Arguments) async throws -> String {
"The weather in \(arguments.city) is sunny and 72°F / 23°C"
}
}
let model = SystemLanguageModel.default
let session = LanguageModelSession(model: model, tools: [WeatherTool()])
let response = try await session.respond {
Prompt("How's the weather in Cupertino?")
}
print(response.content)Поддерживаемые провайдеры:
• Apple Foundation Models
• Core ML models
• MLX models
• llama.cpp (GGUF models)
• Ollama HTTP API
• Anthropic Messages API
• Google Gemini API
• OpenAI Chat Completions API
🔸 Курс «Специалист по ИИ»
🔸 Получить консультацию менеджера
🔸 Сайт Академии 🔸 Сайт Proglib
#буст #iOS
Please open Telegram to view this post
VIEW IN TELEGRAM
Android-разработчик Middle+ — до 250 000 ₽, удалёнка
Mobile KMP developer (Android/IOS + Flutter) — от 360 000 до 420 000 ₽, удалёнка
Senior Android Developer (Seller Experience) — от 300 000 до 400 000 ₽, удалёнка
Kotlin / Java разработчик (middle/senior) — гибрид (Москва)
Flutter разработчик — удалёнка
🔸 Курс «Специалист по ИИ»
🔸 Получить консультацию менеджера
🔸 Сайт Академии 🔸 Сайт Proglib
#свежак
Please open Telegram to view this post
VIEW IN TELEGRAM
В карточках рассказали о способах, которые помогут подстраховать себя на работе в период кризиса в IT-индустрии.
👉 Читать статью
🔸 Курс «Основы IT для непрограммистов»
🔸 Получить консультацию менеджера
🔸 Сайт Академии 🔸 Сайт Proglib
#MadeInProglib
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Структуры в Swift легковесны и быстры, но их неправильное применение бьет по производительности. Разбираем главные ошибки.
Структуры — типы значений. При передаче или присваивании создается копия:
struct UserProfile {
let name: String
let bio: String
let posts: [Post] // Большой массив
let followers: [Follower]
let following: [Following]
}Обновление
bio вынудит скопировать все массивы, даже если меняем одно поле.Решение: Выносим тяжёлые данные в класс:
final class UserDataStore {
var posts: [Post] = []
var followers: [Follower] = []
var following: [Following] = []
}
struct UserProfile {
let name: String
var bio: String
let store: UserDataStore // Общая ссылка
}Теперь копируются только
name и bio, а массивы используются совместно.Для стандартных типов (
String, Array, Dictionary) Swift применяет оптимизацию Copy-on-Write: физическое копирование происходит только при изменении.Пишите в структуры сколько угодно
[String], [Int] и т.д. — пока не меняете их, копирования не будет.Структуры не разделяют состояние:
struct Counter { var count = 0 }
var a = Counter()
var b = a
a.count += 1
print(b.count) // 0, а не 1Для общего состояния нужен класс.
Итог:
Правильное использование структур сохранит скорость и безопасность вашего кода.
🔹 Курс «Основы IT для непрограммистов»
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib
#буст #MiddlePath #Swift
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3
Please open Telegram to view this post
VIEW IN TELEGRAM
Почему список продуктов не отображается?
Anonymous Quiz
14%
Переменная products объявлена как var, а не val
52%
Отсутствует вызов notifyDataSetChanged()
11%
Проблема с областью видимости lifecycleScope
13%
Неправильная работа с RecyclerView.Adapter
10%
Посмотреть ответ
🌚1👾1
Многие во Flutter привыкли собирать интерфейс из виджетов, не задумываясь, как они вообще устроены. Действительно, стандартных виджетов хватает почти на всё. Почти. Иногда возникает задача, где готовых решений нет или их производительности недостаточно. В такие моменты хочется залезть глубже в движок Flutter и написать что‑то своё на уровне рендеринга.
Автор статьи рассказывает, как сделать собственный RenderObject (конкретно RenderBox) с нуля.
🔸 Курс «Математика для Data Science»
🔸 Получить консультацию менеджера
🔸 Сайт Академии 🔸 Сайт Proglib
#свежак
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
🆚 В чем основное различие между viewModelScope и lifecycleScope в Android
При работе с корутинами в Android разработчики часто используют два самых распространённых скоупа — viewModelScope и lifecycleScope. Оба они упрощают управление асинхронными задачами и предотвращают утечки памяти, но при этом имеют разные цели и правила работы.
Разберёмся, чем они отличаются и в каких ситуациях каждый стоит применять.
👉 Читать статью
🔹 Курс «Основы IT для непрограммистов»
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib
🐸 Библиотека мобильного разработчика
#свежак #Android
При работе с корутинами в Android разработчики часто используют два самых распространённых скоупа — viewModelScope и lifecycleScope. Оба они упрощают управление асинхронными задачами и предотвращают утечки памяти, но при этом имеют разные цели и правила работы.
Разберёмся, чем они отличаются и в каких ситуациях каждый стоит применять.
🔹 Курс «Основы IT для непрограммистов»
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib
#свежак #Android
Please open Telegram to view this post
VIEW IN TELEGRAM
🥱1
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Что выведет код?
Anonymous Quiz
6%
true true true
17%
false false true
58%
true false true
19%
Ошибка компиляции
Please open Telegram to view this post
VIEW IN TELEGRAM
😁5
Отправлять по 50 откликов в день, готовиться к техническим интервью, делать сайт-портфолио — все это можно автоматизировать с помощью ИИ. Мы протестировали кучу сервисов и выбрали только те, что реально экономят время и повышают шансы на оффер. Читай и внедряй.
👉 Читать статью
🔸 Курс «Основы IT для непрограммистов»
🔸 Получить консультацию менеджера
🔸 Сайт Академии 🔸 Сайт Proglib
#MadeInProglib
Please open Telegram to view this post
VIEW IN TELEGRAM
Приготовили для вас дайджест по актуальному из мира iOS, Android.
Используя Transferable, вы не только упрощаете реализацию, но и делаете своё приложение совместимым с современными формами взаимодействия, от буфера обмена до перетаскивания, используя единую модель данных.
В этой статье вы узнаете, что такое RemoteCompose, поймете его основную архитектуру и откроете для себя преимущества, которые он предоставляет для динамического создания экранов с помощью Jetpack Compose.
Автор расскажет, как снизил потребление памяти macOS-приложения на Flutter более чем на 90%. Это потребовало неожиданно много усилий и включало создание собственного хоста для Flutter, разработку пользовательского плагина для перетаскивания и отладку кучи кода на Rust.
🔹 Курс «Основы IT для непрограммистов»
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib
#свежак
Please open Telegram to view this post
VIEW IN TELEGRAM
Замыкания (сlosures) представляют самодостаточные блоки кода, которые могут использоваться многократно в различных частях программы, в том числе в виде параметров в функциях.
По сути функции являются частным случаем замыканий. Замыкания могут иметь одну из трех форм:
В прошлых темах были рассмотрены глобальные и вложенные функции, поэтому в данной теме рассмотрим только замыкающие выражения.
Замыкающие выражения в общем случае имеют следующий синтаксис:
{ (параметры) -> тип_возвращаемого_значения in
инструкции
}Если замыкания не имеют параметров или не возвращают никакого значения, то соответствующие элементы при определении замыкания могут опускаться.
Подобно тому, как переменная или константа могут представлять ссылку на функцию, они также могут представлять ссылку на замыкание:
let hello = { print("Hello world")}
hello()
hello()В данном случае константе hello присваивается анонимная функция, которая состоит из блока кода, в котором выполняются некоторые действия. Эта функция не имеет никакого имени, мы ее можем вызывать только через константу hello.
Фактически константа hello в данном случае имеет тип ()->() или ()-gt;Void:
let hello: ()->Void = { print("Hello world")}Дополнительно можно определить список параметров с помощью ключевого слова in:
let hello = {
(message: String) in
print(message)
}
hello("Hello")
hello("Salut")
hello("Ni hao")В данном случае замыкание принимает один параметр - message, который представляет тип String. Список параметров указывается до ключевого слова in, а после идут инструкции функции.
Также можно определить возвращаемое значение:
let sum = {
(x: Int, y: Int) -> Int in
return x + y
}
print(sum(2, 5)) // 7
print(sum(12, 15)) // 27
print(sum(5, 3)) // 8#буст #JuniorKit #Swift
Please open Telegram to view this post
VIEW IN TELEGRAM
Коллеги, давайте разберем, как легко рисовать и анимировать полосатые узоры в Jetpack Compose с помощью всего лишь одной умной функции.
🔹 Основная идея
Всё строится на использовании
Brush.linearGradient() и параметра colorStops. Секрет в том, чтобы разместить две цветовые точки с разными цветами в одной позиции. Это создаст не плавный переход, а резкую границу между полосами.🔹 От простого к сложному
1. Создаем две половинки:
Brush.linearGradient(
0.0f to Color.Black, // Начало черного
0.5f to Color.Black, // Конец черного (резкий переход!)
0.5f to Color.White, // Начало белого (в той же точке)
1.0f to Color.White // Конец белого
)
2. Рисуем повторяющийся узор:
Добавляем
TileMode.Repeated и задаем размер одного повторения через start и end:start = Offset(0f, 0f),
end = Offset(20f, 0f),
tileMode = TileMode.Repeated
3. Анимируем смещением:
Двигаем начальную и конечную точки с помощью
animatedOffset — и полосы "побежали".🔹 Готовое решение: функция
Brush.stripes()Чтобы не возиться с
colorStops каждый раз, можно создать удобную функцию-расширение:fun Brush.Companion.stripes(
vararg stripes: Pair<Color, Float>, // Цвет и его "вес"
width: Float = 20f, // Ширина одного повторения
angle: Float = 45f, // Угол наклона
phase: Float = 0f // Сдвиг для анимации
): Brush { ... }
Использовать — одно удовольствие:
// Равные полосы
Brush.stripes(
Color.Pink to 1f,
Color.Transparent to 1f,
width = 10.dp.toPx(),
angle = 45f
)
// Разные ширины и цвета
Brush.stripes(
Color.Red to 1f,
Color.Blue to 2f, // В 2 раза шире
Color.Green to 1f
)
🔹 Пример анимации загрузки
val phase by rememberInfiniteTransition()
.animateFloat(0f, 1f, animationSpec = infiniteRepeatable(tween(300)))
Box(
modifier = Modifier
.fillMaxWidth()
.height(4.dp)
.drawBehind {
drawRect(
brush = Brush.stripes(
White to 1f,
Zinc900 to 1f,
width = 10.dp.toPx(),
angle = 45f,
phase = -phase // Анимируем здесь!
)
)
}
)
🔹 Итог
Техника простая, но мощная:
• Основа — резкие градиенты через
colorStops• Повторение —
TileMode.Repeated• Анимация — смещение
phase или точек• Упрощение — своя функция
Brush.stripes()Отлично подходит для индикаторов загрузки, фоновых текстур, визуальных эффектов.
#PixelPerfect #MiddlePath #Kotlin
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Релиз-кандидат твоей карьеры 2026
В мобилке конкуренция бешеная. Чтобы твое резюме не крашилось на этапе скрининга, нужно качать фундаментальные скиллы.
Запускаем новогодний оффер 1 + 2:
Покупаешь один курс — получаешь три. Оплачивается только самый дорогой, остальные идут бонусом.
Что выбирают мобильные разработчики:
— алгоритмы и структуры данных (база для FAANG);
— архитектуры и шаблоны проектирования.
Обновить версию себя
Актуально до 31 декабря.
Сложно выбрать? Пиши менеджеру: @manager_proglib
В мобилке конкуренция бешеная. Чтобы твое резюме не крашилось на этапе скрининга, нужно качать фундаментальные скиллы.
Запускаем новогодний оффер 1 + 2:
Покупаешь один курс — получаешь три. Оплачивается только самый дорогой, остальные идут бонусом.
Что выбирают мобильные разработчики:
— алгоритмы и структуры данных (база для FAANG);
— архитектуры и шаблоны проектирования.
Обновить версию себя
Актуально до 31 декабря.
Сложно выбрать? Пиши менеджеру: @manager_proglib