Главное правило:
Если применяете glassEffect() к кастомным вью — оборачивайте их в общий контейнер (например, HStack или UIView).
ZStack {
HStack {
FirstView()
SecondView()
}
.glassEffect() // Эффект применяется ко всей группе
}
HStack {
ZStack { // Отдельные контейнеры для каждой вью
FirstView()
.glassEffect() // Эффект применяется только к данному вью
}
ZStack { // Отдельные контейнеры для каждой вью
SecondView()
.glassEffect() // Эффект применяется только к данному вью
}
}🔸 Glass-эффект анализирует пиксели вокруг себя для создания полупрозрачного размытия.
🔸 Если наложить два эффекта друг на друга — получится грязное наложение (артефакты, мерцание).
🔸 Нативные системные элементы (навигация, тулбары) уже содержат правильную группировку — их не нужно оборачивать.
🔹 Если используете одиночный glass-элемент без пересечений с другими.
🔹 Для статичного фона (например, картинка под стеклом).
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍24🔥15✍3❤2
Одна из самых сложных управленческих дилемм возникает, когда человек, который должен брать на себя все больше и справляться с этим лучше с каждым днем, вместо этого лажает или просто плохо выполняет свою работу.
🔸 Талантливый специалист ≠ хороший руководитель. Если сотрудника повысили, но не научили управленческим навыкам, он может тонуть в задачах, которые раньше решал за час.
🔸 Сильные сотрудники часто берут на себя слишком много — особенно если им не говорят «стоп». Со временем это приводит к ошибкам и апатии.
🔸 Даже топовые специалисты — живые люди. Развод, болезнь, уход за родственником снижают концентрацию.
🔸 Если сотрудник не чувствует поддержки коллег или борется с токсичным окружением, его мотивация падает.
🔸 Рутина убивает амбиции. Если человек не видит развития, он начинает работать «на минимуме».
🔸 Хронический стресс, депрессия, недосып или синдром самозванца снижают продуктивность.
🔸 Если компания резко меняет курс (например, с качества на скорость), принципиальные сотрудники теряют мотивацию.
🔸 Плохое согласование может привести к неэффективной работе сотрудников.
Прежде чем ругать сотрудника, разберитесь в причинах. Часто проблема не в нём, а в системе.
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
👀23👍16❤2🤝2
С выходом Swift 6 работа с ошибками стала точнее. Теперь вместо простого throws можно указывать конкретный тип или даже вариант ошибки, что делает код безопаснее и понятнее.
func readFile(at path: String) throws -> String {
}
func readFile(at path: String) throws(FileNotFoundError) -> String {
}
Если функция попытается выбросить другой вариант FileNotFoundError (например FileNotFoundError.whileSearchingFile), компилятор заранее сообщит об ошибке.
🔹 Безопасность: компилятор проверяет, что вы ловите именно те ошибки, которые задекларированы.
🔹 Читаемость: из сигнатуры функции сразу видно, что может пойти не так.
🔹 Упрощение кода: больше не нужен «универсальный» catch для всех неизвестных ошибок:
do {
let content = try readFile(at: "path")
} catch FileNotFoundError.whileReadingFile {
print("Файл поврежден")
} catch FileNotFoundError.whileSearchingFile {
print("Ошибка при поиске файла")
}
🔸 Тип ошибки должен соответствовать протоколу Error.
🔸 Можно указать как общий catch (как было ранее), так и конкретный case из enum.
Typed Throws в Swift 6 — это шаг к предсказуемому и самодокументируемому коду. Меньше скрытых багов, проще отладка!
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥26👍13❤2
На WWDC25 Apple представила крупное обновление Xcode 26 и новые инструменты для оптимизации SwiftUI приложений.
Команда Apple Music и разработчики Instruments показали, какие проблемы теперь можно отследить в SwiftUI:
🔹 Лишние обновления View (которые вызывают лаги анимации и скролла).
🔹 Подвисания интерфейса (Hitches).
🔹 Медленные списки (теперь обновляются в 16 раз быстрее).
Новый SwiftUI Instrument в Xcode 26 детально показывает:
🔸 Какие View обновляются и почему.
🔸 Как часто происходят ререндеры.
🔸 Time Profiler + Hitches Tool помогают находить узкие места.
Пример из сессии WWDC25:
Мы нашли View, которая обновлялась 300 раз в секунду без причины. После фикса FPS вырос с 40 до 60.
🔹 Ускорение разработки (меньше ждёте загрузку Xcode).
🔹 Энергоэффективность (Power Profiler спасёт батарею пользователей).
🔹 Плавный интерфейс (SwiftUI Instrument избавит от лагов).
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
👍27❤13🔥2
В Swift современный подход к многопоточности: Structured Concurrency — позволяет легко управлять асинхронными операциями, сохраняя читаемость кода. Рассмотрим два ключевых сценария: последовательное и параллельное выполнение.
Когда задачи зависят друг от друга или должны выполняться по очереди:
func fetchData() async {
// Сначала загружаем аккаунты, затем задачи
let accounts = await fetchAccounts()
let tasks = await fetchTasks(accounts: accounts)
print("Аккаунты: \(accounts)")
print("Задачи: \(tasks)")
}
🔸 Выполняется пошагово: fetchAccounts() → fetchTasks()
🔸 Подходит, если второй запрос требует данных из первого.
🔸 Простота отладки (очевидный порядок выполнения).
Когда задачи независимы и можно сэкономить время, выполняя их одновременно:
func fetchData() async {
// Параллельный запуск
async let accountsRequest = await fetchAccounts()
async let tasksRequest = await fetchTasks()
// Ожидаем результаты
let (accounts, tasks) = await (accountsRequest, tasksRequest)
print("Аккаунты: \(accounts)")
print("Задачи: \(tasks)")
}
🔸 Обе функции запускаются одновременно.
🔸 Общее время выполнения ≈ времени самой долгой задачи.
🔸 async let создает параллельное подзадачи.
🔸 Результаты доступны только после await.
Иерархия задач:
🔹 Родительская задача ждет завершения дочерних (async let).
🔹 Отмена родительской отменяет и дочерние.
Безопасность:
🔹 Компилятор контролирует await, предотвращая deadlock.
🔹 Ошибки распространяются корректно.
Эффективность:
🔹 Система сама решает, сколько потоков использовать.
🔹 Нет ручного управления (DispatchQueue не нужен).
🔸 await — для последовательного кода.
🔸 async let — для параллельных операций.
🔸 Structured Concurrency делает асинхронный код предсказуемым
Используйте эти подходы, чтобы оптимизировать работу с сетью, базами данных или тяжелыми вычислениями.
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
❤26👍13👀1
Владимир Путин сегодня подписал закон, который обязывает Apple разрешить установку российского магазина приложений RuStore на iPhone.
Теперь производителям запрещено блокировать его загрузку на устройства, продаваемые в России. Если RuStore установлен (даже если вы скачали его сами), Apple не может замедлять его работу, мешать обновлять приложения, ограничивать платежи или ухудшать работу смартфона из-за российского магазина приложений.
Несоблюдение этих правил будет считаться нарушением прав потребителей — это грозит серьезными штрафами.
Закон вступает в силу 1 сентября 2025 года.
Компания всегда строго охраняла свою экосистему, и неизвестно, как она отреагирует на требование открыть iPhone для стороннего магазина.
Лично мне кажется, что Apple всё же разрешит RuStore. Россия — важный рынок, и компания вряд ли захочет рисковать штрафами или уходом с него. Да, их система всегда была закрытой, но ради бизнеса они могут пойти на уступки — как уже делали в других странах.
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥24👍17❤2👏2
NavigationView — это основной компонент для организации навигации в SwiftUI приложениях. Он позволяет создавать иерархические переходы между экранами, похожие на стандартные UINavigationController в UIKit.
🔹 Стековая навигация (push/pop).
🔹 Автоматическая кнопка "Назад".
🔹 Поддержка заголовков и панелей инструментов.
struct MenuView: View {
var body: some View {
NavigationView {
List {
NavigationLink("Первый экран", destination: FirstScreen())
NavigationLink("Второй экран", destination: SecondScreen())
}
.navigationTitle("Главное меню")
}
}
}
🔸 navigationTitle - задает заголовок экрана.
🔸 navigationBarItems - добавляет кнопки в панель навигации.
🔸 navigationBarHidden- скрывает панель навигации.
NavigationLink - основной способ перехода между экранами:
NavigationLink(destination: FirstScreen()) {
Text("Первый экран")
}
🔹 Не вкладывайте несколько NavigationView друг в друга.
🔹 Для сложной навигации используйте NavigationStack.
🔹 Помните, что стиль навигации может отличаться на разных платформах (iOS, macOS).
NavigationView значительно упрощает реализацию навигации по сравнению с UIKit, сохраняя при этом привычный пользователям iOS интерфейс.
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
👍19❤11🤝4
@Observable: магия SwiftUI теперь доступна в UIKit.С iOS 18 и macOS 15 UIKit получил скрытую фичу, которая меняет правила игры — автоматическое отслеживание изменений данных через
@Observable. Больше не нужны ручные вызовы setNeedsLayout() — интерфейс теперь обновляется сам!Помечаем модель макросом
@Observable:
import Observation
@Observable
class User {
var name = "Иван"
var unreadMessages = 0
}
Читаем данные в стандартных методах ViewController:
class ProfileVC: UIViewController {
let user = User()
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
// UIKit автоматически отследит эти изменения
nameLabel.text = user.name
messagesCountLabel.text = "\(user.unreadMessages)"
}
}
Изменяем данные — интерфейс обновится автоматически:
@objc func buttonDidTap() {
// Значение messagesCountLabel обновится автоматически
user.unreadMessages += 1
}
Включаем отслеживание
@Observable в Info.plist:
<key>UIObservationTrackingEnabled</key>
<true/>
В iOS 26 это работает из коробки без настройки.
🔸 Автоматическое отслеживание изменений работает в viewWillLayoutSubviews(), layoutSubviews() и новом методе updateProperties(), который вызывается перед layoutSubviews для оптимизации.
🔸 Обновление интерфейса после обновления данных возможно только в main thread.
🔸 Важно не забывать про retain cycles, при работе с
@Observable.🔸 Рекомендуется избегать обновление данных без необходимости, так как частое обновление интерфейса может сказаться на производительности приложения.
Теперь UIKit умеет так же удобно обновлять интерфейс, как SwiftUI. Главное — правильно использовать
@Observable и не забывать про потокобезопасность.Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
👍22❤9🔥3
Буквально недавно обсуждали, что никаких запретов в сторону Apple не ожидается, а вот вам и здравствуйте. В Госдуме сообщили, что в случае отказа Apple содействовать работе российского магазина приложений RuStore на своих устройствах, в отношении компании могут ввести санкции, вплоть до полного запрета продаж iPhone на территории России.
Хотя в текущем году таких мер не планируется, ограничения могут начать действовать уже в следующем году, если компания не изменит свою позицию. На данный момент Apple не прокомментировала новый закон и возможные последствия.
Переобулись уж очень быстро
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
🗿28🤯12🫡3
#Playground в Xcode 26: запускаем код без лишних файлов.С выходом Xcode 26 появился удобный инструмент для быстрого тестирования кода прямо в проекте — макрос
#Playground. Теперь не нужно создавать отдельные .playground файлы, чтобы проверить идею.import Playgrounds
#Playground {
let person = Person(name: "Артем")
print(person.name.uppercased())
}
После чего смотрим результат в Canvas (как с SwiftUI превью, пример на изображении).
🔹 Экономия времени — не нужно переключаться между файлами.
🔹 Тестирование на реальных данных — используете структуры из проекта.
🔹 Несколько превью в одном файле — можно подписать каждое:
#Playground("Проверка имени") {
print(Person(name: "Анна").name.count)
}🔸 Требует Xcode 26+ и iOS 18/macOS 15.
🔸 Пока нет поддержки интерактивного редактирования (как в обычных Playgrounds).
#Playground — это лайт-версия Playgrounds прямо в рабочих файлах. Не заменяет полноценные .playground файлы для сложных экспериментов, но идеален для повседневных задач.Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍25🔥12❤6👀1
На WWDC25 компания Apple представила новые компоненты WebView и WebPage, которые значительно упрощают интеграцию веб-контента в SwiftUI приложения, которые доступны с iOS 18.4.
Отслеживание состояния:
@State private var isLoading: Bool = false
@State private var progress: Double = 0.0
WebPage(url: URL(string: "https://t.me/hardworkerIT"))
.onLoadingChanged { loading in
isLoading = loading
}
.onProgressChanged { progress in
self.progress = progress
}
Обработка событий навигации (currentNavigationEvent), таких как ошибки, перенаправления, завершение загрузки.
Теперь есть возможность сохранения веб-контента в следующих форматах:
🔹 Снимки экрана (PNG/JPEG).
🔹 PDF.
🔹 Веб-архивы (полное сохранение страницы).
WebPage(url: someURL)
.saveSnapshot(as: .pdf) { result in
switch result {
case .success(let data):
// Сохраняем PDF
case .failure(let error):
print("Ошибка: \(error)")
}
}
Есть возможность отображения сохраненных страниц:
WebArchiveView(data: archivedData)
🔹 Скролл к определённому элементу на странице.
🔹 Расширенное взаимодействие с JavaScript.
🔹 Кастомные обработчики для ссылок и форм.
🔸 Проще, чем WKWebView — не нужно писать обёртки для SwiftUI.
🔸 Нативные состояния загрузки — больше никаких кастомных индикаторов.
🔸 Готовые решения для экспорта и архивирования.
🔹 Требуется iOS 18.4+ / macOS 15.4+.
🔹 Для сложных сценариев (например, кастомные схемы URL) всё ещё может потребоваться WKWebView.
Больше информации доступно в официальной документации.
Новые API делают работу с веб-контентом в SwiftUI такой же простой, как и с любыми другими вью. Теперь встраивать браузеры, документацию или веб-интерфейсы стало ещё удобнее!
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥23❤11👍6👀2
На WWDC25 компания Apple представила Xcode 26 с революционным ИИ ассистентом, который переосмысливает процесс создания приложений. Вот что ждет разработчиков.
ИИ помощник: код как диалог.
🔹 Анализирует стиль кода и предлагает персонализированные варианты.
🔹 Генерирует шаблонный код (делегаты, сетевые запросы).
🔹 Находит синтаксические и логические баги до запуска.
🔹 Подсказывает оптимизации для Swift / Objective-C.
// Вы начинаете печатать:
@State private var isLoading = false
// ИИ сразу предлагает:
.onChange(of: isLoading) { newValue in
print("Loading state changed: \(newValue)")
}
Тесная интеграция с экосистемой Apple.
🔹 Swift Playgrounds: ИИ помогает экспериментировать с кодом в реальном времени.
🔹 TestFlight: автоматически анализирует краши и предлагает фиксы.
🔹 Core ML: упрощает внедрение ML-моделей (подсказывает код для обработки данных).
Мультиязыковая поддержка.
ИИ работает с:
🔹 Swift (приоритет).
🔹 Objective-C.
🔹 C++.
🔹 SwiftUI / UIKit.
Отладка нового уровня.
🔹 Определяет корневую причину падений.
🔹 Предлагает готовые решения.
🔹 Показывает графики потребления CPU / памяти.
🔹 Выявляет утечки без Instruments.
🔸 Скорость: на 30-50% меньше рутинных задач.
🔸 Качество: меньше багов в продакшене.
🔸 Доступность: новым разработчикам проще входить в экосистему.
🔸 Mac на Apple Silicon (M1+).
🔸 Xcode 26 (минимум).
Xcode 26 — это не просто обновление, а смена парадигмы. Теперь ИИ берет на себя шаблонные задачи, оставляя вам творческую часть — архитектуру и инновации.
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥24👍11❤7👏1
В SwiftUI появился долгожданный инструмент для точного контроля отступов в секциях List — модификатор listSectionMargins(). Теперь можно гибко настраивать отступы для отдельных секций, не прибегая к костылям.
Модификатор принимает:
🔸 edges — стороны для отступов (по умолчанию .all).
🔸 length — величина отступа в точках.
List {
Section("Новости") {
Text("Свежие обновления")
}
.listSectionMargins(.horizontal, 20) // Отступы по бокам
Section("Профиль") {
Text("Настройки")
}
.listSectionMargins(.top, 10) // Отступ сверху
}
🔹 Переопределяет стандартные отступы: заменяет дефолтные отступы, заданные стилем списка.
🔹 Работает с заголовками/подвалами: отступы применяются вокруг header и footer секции.
🔹 Гибкость: можно задавать для конкретных сторон (.horizontal, .vertical, .top и т.д.) или для всех сторон сразу (.all).
🔹 Не влияет на отступы между ячейками (для этого по-прежнему используем listRowSpacing).
🔸 Неочевидные комбинации padding() + listRowInsets().
🔸 Кастомные разделители.
🔸 Костыли с GeometryReader.
Теперь всё решается одним модификатором!
listSectionMargins() — это отличное дополнение для тонкой настройки списков!
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥25👍9❤6👀2
В Swift и классы, и actor используются для создания ссылочных типов, но с разными целями. Главное отличие — в потокобезопасности. Actor появились в Swift 5.5 как часть Concurrency.
🔹 Не потокобезопасны: доступ к свойствам и методам из разных потоков может привести к гонкам данных.
🔹 Поддерживают наследование: можно создавать подклассы.
🔹 Используются для общего состояния: подходят для объектов, которые не требуют синхронизации.
class Counter {
var value = 0
func increment() {
value += 1 // Опасность при вызове из разных потоков
}
}
🔹 Потокобезопасны: Swift автоматически сериализует доступ к свойствам и методам (очередь задач).
🔹 Нет наследования: нельзя наследовать от actor.
🔹 Для изолированного состояния: идеальны для данных, которые изменяются из разных потоков.
actor SafeCounter {
private var value = 0
func increment() {
value += 1 // Безопасно (автоматическая синхронизация)
}
func currentValue() -> Int {
return value
}
}
let counter = SafeCounter()
Task {
await counter.increment()
let value = await counter.currentValue()
print(value) // 1
}
🔸 Для вызова методов actor нужен await.
🔸 Свойства actor по умолчанию private.
🔹 Классы — для простых объектов без многопоточности.
🔹 Actor — для данных, изменяемых из разных потоков (счетчики, кеши, состояния).
Если нужно потокобезопасное решение — выбирайте actor. Если важна гибкость и наследование — class.
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
👍25🔥10❤7🫡1
И почему стаж ≠ опыт.
Грейды в IT — не про годы опыта, а про образ мышления. Вот ключевые различия между джуном и сеньором, которые заметны в реальной работе.
Джун:
🔹 Фокусируется на своей задаче.
🔹 Пишет код по ТЗ, не всегда понимая, как он влияет на систему.
Сеньор:
🔹 Видит связи между компонентами.
🔹 Спрашивает: как это повлияет на поддержку, бизнес или пользователей?
🔹 Выбирает простые, но надежные решения, даже если они менее модные.
Джун:
🔹 Исправляет баги, если их явно указали.
🔹 Может переложить проблему: «Это не мой модуль».
Сеньор:
🔹 Не оставляет баги в проде, даже если это не его зона ответственности.
🔹 Понимает: код — это не абстракция, а функционал для живых людей.
Джун:
🔹 Учится у других, редко делится знаниями.
🔹 В код ревью пишет минорные замечания, без изучения глубокой логики.
Сеньор:
🔹 Находит слабые места в команде и помогает их закрыть.
🔹 Дает тактичные замечания при code review, объясняет почему следует внести исправления с аргументами, а не только указывает на проблемный код.
🔹 Говорит: давай разберем твой подход вместе, вместо ты неправ.
Джун:
🔹 Хочет использовать новейший стек, потому что так круто.
🔹 Пишет на SwiftUI, когда нужен UIKit (и наоборот).
Сеньор:
🔹 Выбирает инструменты под конкретную задачу и бюджет.
🔹 Может выполнить рекомендацию по использованию стабильного стека, если видит в этом больше плюсов, а не использует все самое модное и нестабильное.
Джун:
🔹 Стремится добавить фичу любой ценой.
🔹 Может переписать рабочий код для красоты.
Сеньор:
🔹 Избегает изучение лишней информации, которая никогда не пригодится.
🔹 Говорит: этот легаси работает — не трогаем или автоматизируем в следующем квартале.
Джун:
🔹 Ждет четких ТЗ.
🔹 Паникует, если требования меняются.
Сеньор:
🔹 Самостоятельно уточняет детали у бизнеса.
🔹 Предлагает MVP решения при нехватке данных.
Сеньор — это не про количество строк кода, а про:
Как говорил один мудрый тимлид: джун думает, как написать. мидл — что написать. сеньор — стоит ли писать.
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
👍28❤12🫡7👀1
Во второй половине 2023 года, после множества доработок чужих приложений на фрилансе, связанных с улучшением здоровья и качества жизни, у меня появилась идея создать собственный счетчик отказа от вредных привычек.
💚 Счетчик дней: вредные привычки.
Конечно, счетчик дней без вредных привычек — не новинка. Но я добавил уникальный функционал, которого не было у конкурентов:
Моя цель – помочь людям бросить вредные привычки и заменить их полезными, а соревновательный элемент делает процесс более мотивирующим и увлекательным.
В скором времени планируется новое обновление, которое привнесет еще больше интересных возможностей в приложение.
🔹 Приложение «Счетчик дней: вредные привычки» для iOS, watchOS и macOS разработано на SwiftUI.
🔹 Версия для Android разработана на Flutter.
🔹 Серверную часть для приложения разрабатывал самостоятельно на PHP.
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
👍20❤18🔥10👏1
На WWDC25 Apple представила новые API для работы с AttributedString в SwiftUI, позволяющие создавать мощные текстовые редакторы с гибким форматированием.
Готовые стили:
🔹 Поддержка жирного текста, курсива, подчеркивания, зачеркивания.
🔹 Изменение размера шрифта и цвета текста.
Кастомные атрибуты:
🔹 Можно добавлять собственные правила форматирования.
Безопасное редактирование:
🔹 AttributedTextValueConstraint ограничивает допустимые атрибуты.
🔹 TextEditor автоматически применяет заданные правила.
Динамическое обновление:
🔹 SwiftUI корректно обрабатывает изменения текста и выделения.
🔸 Редакторы статей/рецептов (как в демо WWDC).
🔸 Приложения для заметок с расширенным форматированием.
🔸 Чат-боты с поддержкой стилизованного текста.
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
👍23🔥9🙏7👀1
Ещё недавно компании боролись за разработчиков, а сегодня на одну вакансию — сотни резюме.
Сегодня вакансий меньше, конкуренция выше, а компании стали жестче отбирать кандидатов. Но хорошие офферы никуда не делись — просто теперь нужно действовать умнее.
🔹 Важно иметь минимум 3 года коммерческого опыта (фриланс и пет-проекты считаются, но котируются меньше).
🔹 Цифры и факты вместо общих фраз. Не «оптимизировал приложение», а «снизил потребление памяти на 25%».
🔹 Если есть пробелы в опыте работы, лучше их закрыть фрилансом или пет проектами.
🔹 Проверьте резюме через ChatGPT или hh-аналитику — даже мелкие ошибки могут отсеять вас.
🔹 Приложите портфолио к резюме. Примеры ваших работ позволят оценить ваш опыт.
🔹 Будьте готовы к лайвкодингу. Без умения решать задачи на глазах у интервьюера шансы равны нулю.
🔹 Тренируйте алгоритмы (LeetCode должен решаться на автомате).
🔹 Перед собеседованием обязательно ищите слитые разборы вопросов по компании (телеграм чаты, форумы, статьи в интернете).
Жирные офферы получают специалисты, умеющие продать себя. Разработчиков много, поэтому берут тех, кого видно. Вот несколько советов, как стать заметнее:
🔹 Ведите технический блог (даже 1 статья в месяц — уже очень хорошо).
🔹 Участвуйте в опенсорс-проектах (это новый must-have для middle+).
🔹 Делайте разборы кейсов в LinkedIn (работодатели это проверяют).
🔹 Выступайте публично, на ИТ мероприятиях или онлайн конференциях.
Медийность = доверие. Если о вас знают, шанс получить оффер гораздо выше.
🔹 Рынок работодателя: вакансий меньше, чем кандидатов.
🔹 Жалобы не помогут: либо адаптируешься, либо останешься без оффера.
🔹 Компании ищут готовых специалистов: доучиваться за их счет не больше не выйдет.
🔹 Удалёнка для джунов почти умерла: готовьтесь к гибридному формату.
🔹 Зарплаты стабилизировались: зп 400к для мидлов осталась в 2023 году.
🔹 Слабые отсеиваются: но те, кто вкатывает, продолжают брать топовые предложения.
Да, рынок уже не тот, но офферы всё ещё есть — их просто получают те, кто готовится лучше других и вкладывается в свою экспертность.
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
❤30🙏13👍8👀1
NavigationStack — это новый (с iOS 16+) и более мощный способ организации навигации в SwiftUI. В отличие от NavigationView, он дает полный контроль над стеком экранов и поддерживает сложные сценарии.
🔹 Программное управление стеком экранов (пуш, поп, переход к корню).
🔹 Глубокая навигация по ссылкам (например, app://products/123).
🔹 Кастомные переходы между экранами.
🔹 Поддержка NavigationPath для хетерогенных данных в стеке.
struct ContentView: View {
@State private var path = NavigationPath()
var body: some View {
NavigationStack(path: $path) {
List {
NavigationLink("Экран 1", value: 1)
NavigationLink("Экран 2", value: "Текст")
}
.navigationDestination(for: Int.self) { value in
Text("Число: \(value)")
}
.navigationDestination(for: String.self) { value in
Text(value)
}
}
}
}
Тип-обертка для управления стеком. Может содержать разные типы данных:
path.append(1)
path.append("ABC")
path.removeLast()
Определяет, какой экран показывать для каждого типа данных:
.navigationDestination(for: Product.self) { product in
ProductView(product: product)
}
Button("Перейти к экрану 3") {
path.append(3)
}
Button("Назад") {
path.removeLast()
}
Button("В корень") {
path.removeLast(path.count)
}
Можно привязать навигацию к URL:
NavigationStack(path: $path) {
}
.onOpenURL { url in
if url.path == "/products/123" {
path.append(Product(id: 123))
}
}
🔸 Для iOS 15 и ниже используйте NavigationView.
🔸 Для модальных окон — sheet или fullScreenCover.
🔸 Не смешивайте NavigationStack и NavigationView.
NavigationStack — это эволюция навигации в SwiftUI. Он идеален для приложений со сложной навигацией, программного управления историей экранов и лубоких ссылок.
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
👍28🔥12🤝6❤1🫡1 1