В Swift нам доступен механизм перегрузки функций, то есть мы можем определять функции с одним и тем же именем, но разным количеством или типом параметров:
func sum(_ x: Int, _ y : Int){
print(x+y)
}
func sum(_ x: Double, _ y: Double){
print(x+y)
}
func sum(_ x: Int, _ y: Int, _ z: Int ){
print(x + y + z)
}
sum(1, 2) // 3
sum(1.2, 2.3) // 3.5
sum(2, 3, 4) // 9В данном случае все три функции называются sum, но так как они отличаются либо по количеству параметров, либо по их типу. При вызове данной функции Swift по типу и количеству параметров сможет распознать, какую именно версию функции sum надо использовать.
Также перегруженные версии одной функции могут отличаться по типу возвращаемого значения:
func sum(_ x: Int, _ y : Int) -> Int{
return x + y
}
func sum(_ x: Int, _ y : Int) -> Double{
return 2 * Double(x + y) // преобразует результат в Double
}
let a : Int = sum(1, 2) // 3
let b : Double = sum(1, 2) // 6.0
print(a) // 3
print(b) // 6.0В данном случае определены две версии функции sum, которые совпадают по типу и количеству параметров, но различаются по типу возвращаемого значения.
Константа a представляет тип
Int, поэтому в выражении let a : Int = sum(1, 2) компилятор увидит, что необходима версия, которая возвращает значение Int, и будет использовать эту версию. Аналогично в выражении let b : Double = sum(1, 2) константа b представляет тип Double, поэтому здесь будет применяться версия функции sum, которая возвращает значение Double. То есть в данном случае у нас ошибок не возникнет.Однако теперь рассмотрим другую ситуацию:
func sum(_ x: Int, _ y : Int) -> Int{
return x + y
}
func sum(_ x: Int, _ y : Int) -> Double{
return 2 * Double(x + y) // преобразует результат в Double
}
let a = sum(1, 2) // Ошибка
let b = sum(1, 2) // ОшибкаЗдесь явным образом не указано, какой тип представляют константы a и b, поэтому их тип будет выводиться изрезультата вызова
sum(1, 2). Но теперь компилятор не знает, какую именно версию функции sum использовать, так как тип констант неизвестен. В итоге в данном случае мы столкнемся с ошибкой.🔹 Курс «Основы IT для непрограммистов»
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib
#буст #JuniorKit #Swift
Please open Telegram to view this post
VIEW IN TELEGRAM
📘 4 декабря стартует набор на курс «Математика для разработки AI-моделей»
Если вы работаете с моделями или хотите перейти в DS/ML, декабрь — идеальный момент закрыть фундаментальные пробелы.
На курсе вы разберёте ключевые разделы, которые лежат в основе современных AI-моделей: линейная алгебра, анализ, оптимизация, математический анализ, вероятности, статистика. Всё через практику в Python.
В программе живые занятия с экспертами AI-индустрии (SberAI, ВШЭ, WB&Russ), разбор реальных задач, квизы и финальный проект.
🌐 Формат: онлайн + доступ к записям
🎁 Бонусы: курс «Школьная математика» в подарок, бесплатный тест по математике
После лекций будет разбор ваших решений и возможность задать вопросы преподавателям.
👉 Записаться на курс
Если вы работаете с моделями или хотите перейти в DS/ML, декабрь — идеальный момент закрыть фундаментальные пробелы.
На курсе вы разберёте ключевые разделы, которые лежат в основе современных AI-моделей: линейная алгебра, анализ, оптимизация, математический анализ, вероятности, статистика. Всё через практику в Python.
В программе живые занятия с экспертами AI-индустрии (SberAI, ВШЭ, WB&Russ), разбор реальных задач, квизы и финальный проект.
🌐 Формат: онлайн + доступ к записям
🎁 Бонусы: курс «Школьная математика» в подарок, бесплатный тест по математике
После лекций будет разбор ваших решений и возможность задать вопросы преподавателям.
👉 Записаться на курс
Современные архитектуры iOS часто основаны на модульности, а Swift Package Manager стал предпочтительным способом структурирования повторно используемых компонентов. Каждый модуль может содержать собственные ресурсы, в том числе локализованные строки, изображения и другие материалы. На бумаге это позволяет разрабатывать и выпускать каждую функцию независимо от других. Однако на практике локализация в Swift Packages не всегда работает так, как ожидают разработчики, после интеграции этих модулей в приложение.
Часто возникает одна и та же проблема: локализованные строки в пакете Swift работают во время разработки, но как только пакет используется в реальном приложении, все строки возвращаются к английскому варианту. Даже если пакет настроен правильно, локализованные
.lproj папки игнорируются во время выполнения. Такое поведение может сбивать с толку, если вы ожидаете, что локализация будет работать автоматически во всех пакетах.🔹 Почему игнорируются локализации в пакетах Swift
Пакеты Swift создаются в виде собственных наборов ресурсов, отдельных от основного набора ресурсов приложения. Несмотря на то, что
.strings файлы хранятся в этих наборах и доступ к ним осуществляется через Bundle.module, система по-прежнему полагается на то, что хост-приложение объявляет, какие локализации оно поддерживает.Если в конфигурации основного приложения явно не указан язык, iOS считает этот язык неподдерживаемым на уровне приложения. В результате среда выполнения возвращается к языку разработки по умолчанию, обычно английскому, независимо от того, какой язык доступен в пакете.
Это ожидаемое поведение системы локализации Apple, а не ошибка. Только основной пакет определяет языковые возможности приложения.
🔹 Необходимое исправление: объявление локализаций в основном приложении
Чтобы локализация Swift Package работала стабильно, в основном приложении необходимо объявить все поддерживаемые языки в
Info.plist под ключом CFBundleLocalizations. После добавления этого списка система будет корректно обрабатывать локализованные строки из всех пакетов ресурсов, в том числе созданных с помощью Swift Package.Минимальная конфигурация может выглядеть следующим образом:
<key>CFBundleLocalizations</key>
<array>
<string>en</string>
<string>fr</string>
</array>
После добавления этой записи ранее игнорируемые
.lproj папки внутри пакетов Swift Package начинают работать сразу.🔹 Заключение
Локализация пакетов Swift Package не представляет сложности, если вы понимаете, как система определяет языки в пакетах. Даже если модули содержат собственные
.lproj папки, основное приложение должно явно указывать все поддерживаемые локализации. Добавление CFBundleLocalizations в Info.plist решает проблему возврата к английскому языку и обеспечивает правильное поведение локализованных ресурсов из пакетов Swift Package.🔸 Курс «Архитектуры и шаблоны проектирования»
🔸 Получить консультацию менеджера
🔸 Сайт Академии 🔸 Сайт Proglib
#АрхитектурныйКод #MiddlePath #Swift
Please open Telegram to view this post
VIEW IN TELEGRAM
Android Developer (Middle+ / Senior) — от 250 000 до 350 000 ₽, удалёнка
Программист (разработчик) flutter — от 100 000 до 220 000 ₽, удалёнка
Мобильный разработчик (React Native) — от 180 000 до 250 000 ₽, удалёнка
Android-разработчик Middle+ — до 250 000 ₽, удалёнка
IOS-разработчик (middle) — от 180 000 до 250 000 ₽, гибрид (Москва)
🔸 Курс «Специалист по ИИ»
🔸 Получить консультацию менеджера
🔸 Сайт Академии 🔸 Сайт Proglib
#свежак
Please open Telegram to view this post
VIEW IN TELEGRAM
В SwiftUI одним из наиболее элегантных способов настройки визуальных элементов является внедрение стилей. Вместо того чтобы вручную передавать явные цвета или параметры стиля по дереву представлений, SwiftUI позволяет внедрять информацию о стиле на более высоком уровне с помощью таких модификаторов, как
.foregroundStyle(), .backgroundStyle(), и .tint(). Эти внедренные стили могут использоваться любым дочерним представлением, которое ссылается на соответствующие динамические значения.Этот подход не только лаконичен, но и позволяет комбинировать элементы и использовать декларативный подход, что полностью соответствует философии дизайна SwiftUI.
Вот простой пример, демонстрирующий, как стили могут неявно передаваться по иерархии представлений:
struct DemoView: View {
var body: some View {
DetailView()
.foregroundStyle(.blue)
.backgroundStyle(.pink)
.tint(.yellow)
}
}В этом примере
DemoView применяет три модификатора стиля:.foregroundStyle(.blue) определяет стиль переднего плана, который будет наследоваться дочерними элементами, ссылающимися на .foreground.backgroundStyle(.pink) добавляет стиль фона..tint(.yellow) устанавливает глобальный оттенок, который влияет на элементы, использующие .tint.Ни один из этих модификаторов не ссылается явно на внутреннюю реализацию DetailView, что делает код модульным и слабосвязанным.
Теперь давайте посмотрим, как
DetailView использует эти стили:struct DetailView: View {
var body: some View {
Text("Primary text")
.foregroundStyle(.background)
.background(.foreground)
Text("Secondary text")
.foregroundStyle(.tint)
}
}Здесь:
.foregroundStyle(.background) указывает тексту использовать заданный стиль фона (в данном случае .pink)..background(.foreground) устанавливает для фона текста стиль переднего плана (в данном случае .blue)..foregroundStyle(.tint), которое соответствует .yellow в родительском представлении.Такой подход позволяет создавать многократно используемые представления с учётом темы. Представлениям не нужно знать, какие конкретные цвета они будут отображать — им нужно лишь обращаться к динамическим стилям, определяемым средой, таким как
.foreground, .background, или .tint.Используя стилистические роли и подставляя значения извне, мы получаем возможность точно контролировать внешний вид, не перегружая внутренние компоненты представления явными параметрами.
🔸 Курс «Основы IT для непрограммистов»
🔸 Получить консультацию менеджера
🔸 Сайт Академии 🔸 Сайт Proglib
#PixelPerfect #MiddlePath #Swift
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
😁9
Validator — это современный лёгкий фреймворк Swift, обеспечивающий элегантную и типобезопасную валидацию входных данных. Созданный на основе мощной системы типов Swift, он легко интегрируется с UIKit и SwiftUI, что упрощает валидацию форм на всех платформах Apple.
Возможности:
🔸 Курс «Специалист по ИИ»
🔸 Получить консультацию менеджера
🔸 Сайт Академии 🔸 Сайт Proglib
#буст #iOS
Please open Telegram to view this post
VIEW IN TELEGRAM
Чип T2 в MacBook — это защита Apple от всего неродного, включая Linux. Но есть способ обойти все ловушки и получить Fedora с рабочим Wi-Fi, звуком и даже Touch Bar. Главное — знать правильную последовательность действий. Показываю на своём примере.
👉 Читать статью
🔸 Курс «Основы IT для непрограммистов»
🔸 Получить консультацию менеджера
🔸 Сайт Академии 🔸 Сайт Proglib
#MadeInProglib
Please open Telegram to view this post
VIEW IN TELEGRAM
CoreML и нейронки в кармане 📱
Мобильные процессоры (NPU) становятся мощнее, и всё больше вычислений переезжает на устройство. Чтобы писать быстрые ML-фичи под iOS/Android и понимать, как сжать модель без потери качества, нужно знать математику.
Запускаем курс «Математика для разработки AI-моделей».
Старт уже завтра.
💰 Цена: 28 200 ₽.
🔥 Для кого: Для тех, кто хочет выйти за рамки обычного UI/Networking.
Успейте занять место:
👉 Записаться
Тест на знание базы: @proglib_academy_webinar_bot
Мобильные процессоры (NPU) становятся мощнее, и всё больше вычислений переезжает на устройство. Чтобы писать быстрые ML-фичи под iOS/Android и понимать, как сжать модель без потери качества, нужно знать математику.
Запускаем курс «Математика для разработки AI-моделей».
Старт уже завтра.
💰 Цена: 28 200 ₽.
🔥 Для кого: Для тех, кто хочет выйти за рамки обычного UI/Networking.
Успейте занять место:
👉 Записаться
Тест на знание базы: @proglib_academy_webinar_bot
😁2
Узнайте, как превратить API‑ключи и токены в невидимые в репозитории и APK данные с помощью собственного Gradle‑плагина.
🔸 Курс «Математика для Data Science»
🔸 Получить консультацию менеджера
🔸 Сайт Академии 🔸 Сайт Proglib
#свежак #Android
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Собрали лучшее о мобильной разработке. Включаем и смотрим по пути на работу.
🔸 Курс «Основы IT для непрограммистов»
🔸 Получить консультацию менеджера
🔸 Сайт Академии 🔸 Сайт Proglib
#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Почему происходит краш при переключении экранов?
Anonymous Quiz
15%
Неправильная работа с опциональными типами
17%
Блокировка основного потока
12%
Проблема с загрузкой Data из URL
35%
Обращение к self после deallocated контроллера
20%
Посмотреть ответ
git worktree – параллельная работа в нескольких ветках без переключенийМощная команда, которая позволяет работать с несколькими ветками Git одновременно в разных директориях. Больше не нужно постоянно переключаться между ветками или клонировать репозиторий несколько раз.
1. Параллельная разработка:
# Главная ветка в основной папке
# feature/auth в отдельной папке
git worktree add ../project-auth feature/auth
# Теперь можно работать с main и feature/auth одновременно!
2. Тестирование PR без переключений:
# Создать worktree для проверки PR коллеги
git worktree add ../pr-review-123 pr/feature-123
# Перейти в папку и запустить тесты
cd ../pr-review-123
npm test
3. Долгие операции в фоне:
# Запустить сборку в отдельной worktree
git worktree add ../project-build build-optimization
cd ../project-build
npm run build:production # Не блокирует основную работу
• Нет конфликтов индекса – каждый worktree имеет свой собственный .git
• Изоляция изменений – работа в одной ветке не влияет на другую
• Экономия времени – мгновенное переключение между контекстами
# 1. Основная работа в main
cd ~/projects/myapp
# 2. Создаем worktree для нового фича
git worktree add ~/projects/myapp-feature -b feature/new-payment
# 3. Работаем одновременно:
# Terminal 1 (main): git log --oneline
# Terminal 2 (feature): git add . && git commit -m "Add payment"
# 4. После мержа feature
git worktree remove ~/projects/myapp-feature
Pro-совет: Добавьте в
.gitconfig:ini
[alias]
wt = worktree
wt-list = worktree list
wt-add = worktree add
wt-remove = worktree remove
🔸 Курс «Основы IT для непрограммистов»
🔸 Получить консультацию менеджера
🔸 Сайт Академии 🔸 Сайт Proglib
#буст #JuniorKit
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1
Как найти деньги на создание игры?
Принять участие в шестом акселе «Фабрика видеоигр» в Москве.
Несколько фактов о нем:
- участвовать могут ЛЮБЫЕ команды — от больших компаний до парочки разрабов инди-игр;
- в программе акселератора: сессии с топ-экспертами, обучение, индивидуальный консалтинг;
- в финале всех пригласят на питчинг с инвесторами — реальный шанс привлечь деньги на разработку
За четыре предыдущих сезона (пятый в процессе питчинга) участники разработали 80 пилотных версий своих игр и уже выводят их на мировой рынок. Лучшие получили в совокупности более 150 миллионов рублей на развитие и масштабирование. А в этом сезоне кроме инвесторов будет еще Московский венчурный фонд - он выдаст персональные гранты.
Если ждешь знак от вселенной — вот он
Принять участие в шестом акселе «Фабрика видеоигр» в Москве.
Несколько фактов о нем:
- участвовать могут ЛЮБЫЕ команды — от больших компаний до парочки разрабов инди-игр;
- в программе акселератора: сессии с топ-экспертами, обучение, индивидуальный консалтинг;
- в финале всех пригласят на питчинг с инвесторами — реальный шанс привлечь деньги на разработку
За четыре предыдущих сезона (пятый в процессе питчинга) участники разработали 80 пилотных версий своих игр и уже выводят их на мировой рынок. Лучшие получили в совокупности более 150 миллионов рублей на развитие и масштабирование. А в этом сезоне кроме инвесторов будет еще Московский венчурный фонд - он выдаст персональные гранты.
Если ждешь знак от вселенной — вот он
Please open Telegram to view this post
VIEW IN TELEGRAM
😁5
ML на мобилках: пора учить матчасть
CoreML и ML Kit делают внедрение нейронок простым, но чтобы реально понимать, как оптимизировать модель под мобильное устройство, нужно знать базу.
Мы перезапустили курс по математике с живыми вебинарами.
Что в программе на этой неделе:
1. Линейная алгебра: векторы, матрицы, определители.
2. Линейная регрессия: как предсказывать значения и интерпретировать коэффициенты.
3. SVD-разложение: как снижать размерность данных (супер-актуально для мобайла).
Вы ещё успеваете присоединиться к потоку и получить доступ ко всем материалам.
Ссылка для регистрации (до 9 декабря):
https://clc.to/LojFzw
CoreML и ML Kit делают внедрение нейронок простым, но чтобы реально понимать, как оптимизировать модель под мобильное устройство, нужно знать базу.
Мы перезапустили курс по математике с живыми вебинарами.
Что в программе на этой неделе:
1. Линейная алгебра: векторы, матрицы, определители.
2. Линейная регрессия: как предсказывать значения и интерпретировать коэффициенты.
3. SVD-разложение: как снижать размерность данных (супер-актуально для мобайла).
Вы ещё успеваете присоединиться к потоку и получить доступ ко всем материалам.
Ссылка для регистрации (до 9 декабря):
https://clc.to/LojFzw
Please open Telegram to view this post
VIEW IN TELEGRAM
Что выведет код?
Anonymous Quiz
74%
Result: [2, 4, 6], Count: 3
12%
Result: [2, 4, 6], Count: 0
4%
Result: [2, 2, 2], Count: 3
11%
Ошибка компиляции
Please open Telegram to view this post
VIEW IN TELEGRAM