Anonymous Quiz
11%
readonly
0%
var
19%
const
70%
let
👍24🔥12🫡5
В Swift типы данных делятся на именованные (собственные) и составные (временные).
Именованные типы:
Это типы, которые объявляются явно и получают своё имя. К ним относятся: структуры, классы, перечисления, протоколы.
struct MyStruct {
let name: String
}
class MyClass {
let value: Int
init(value: Int) {
self.value = value
}
}
Составные типы:
Это временные типы, которые компилятор создаёт автоматически. Они не имеют собственного имени и используются в момент вычислений. К ним относятся: функциональные типы и кортежи.
let coordinates: (x: Int, y: Int) = (10, 20)
let doPrint: (String) -> Void = { print($0) }
🔸 Именованные — когда нужна чёткая структура и повторное использование.
🔸 Составные — для временных данных или сокращения кода.
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
👍22❤11🔥5
Generics — это механизм, который позволяет писать универсальные функции и типы, работающие с любыми типами данных, сохраняя при этом полную типобезопасность.
🔹 Уменьшают дублирование кода:
Больше не нужно писать отдельные функции для Int, Float и других типов — один обобщённый вариант заменит их все.
🔹 Обеспечивают типобезопасность:
Компилятор проверяет типы на этапе компиляции, предотвращая ошибки в рантайме.
🔹 Повышают переиспользуемость:
Один алгоритм можно применять к разным типам данных без изменений.
Дженерики используют параметры типа (обычно обозначаются <T>, <Element> и т. д.), которые заменяются конкретными типами при компиляции.
func plusValue<T: Numeric>(first: T, second: T) -> T {
return first + second
}
let a = 5
let b = 10
print(plusValue(first: a, second: b)) // 15
let c = 0.5
let d = 3.0
print(plusValue(first: c, second: d)) // 3.0
//
struct Stack<Element> {
private var elements = [Element]()
mutating func push(_ element: Element) {
elements.append(element)
}
mutating func pop() -> Element? {
return elements.popLast()
}
}
var intStack = Stack<Int>()
intStack.push(1)
var stringStack = Stack<String>()
stringStack.push("Swift")
Иногда нужно указать, что тип T должен соответствовать определённым требованиям. Для этого используют протоколы:
func plusValue<T: Numeric>(first: T, second: T) -> T {
return first + second
}
Здесь T должен являться числом (Numeric), иначе код не скомпилируется.
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
👍22❤13🔥5
Главный навык разработчиков будущего - уметь писать не только код, чтобы добавить экран в приложение, но и понимать для чего добавляется та или иная кнопка. Т.е. быть ориентированным на продукт. О чем я кстати не раз уже упоминал в блоге. На таких разработчиков работодатели будут всегда охотнее смотреть, так как они мыслят намного шире своей первоначальной специализации, соответственно решение будет более выигрышно для бизнеса. Вот несколько советов, как развивать его разработчику:
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
👍27❤13🔥7
Госдума приняла закон, обязывающий предустанавливать RuStore на ВСЕ продаваемые смартфоны и планшеты — включая технику Apple!
С 1 сентября (как раз к выходу iOS 26!) продавать iPhone и iPad можно будет только при условии, что на них можно устанавливать и обновлять приложения через RuStore.
Apple придется срочно решать: пойти на беспрецедентные уступки российским требованиям или рисковать штрафами.
Однако депутат Антон Горелкин объяснил, что никак запрещать продажи iPhone и iPad в случае неисполнения закона не планируется.
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
🗿24👀14🤯8
@EnvironmentObject в SwiftUI.@EnvironmentObject — это property wrapper, который позволяет передавать общие данные между несколькими View без явной передачи через инициализатор.
class UserSettings: ObservableObject {
@Published var isDarkMode = false
}
@main
struct MyApp: App {
var settings = UserSettings()
var body: some Scene {
WindowGroup {
ContentView()
.environmentObject(settings) // Передаем объект в корневой вью
}
}
}
struct ProfileView: View {
@EnvironmentObject var settings: UserSettings // Автоматическая подписка на объек в сабвью
var body: some View {
Toggle("Темная тема", isOn: $settings.isDarkMode)
}
}
🔸 Автоматическое обновление: View перерисовывается при изменении
@Published свойств.🔸 Глобальный доступ: объект доступен в любой части иерархии View без цепочки
@Binding.🔸 Безопасность: если объект не передан в .environmentObject(), приложение крашнется — это помогает находить ошибки на раннем этапе.
🔹 Для глобальных настроек (тема, язык, авторизация и т.д.).
🔹 Когда нужно делиться данными между несвязанными View.
🔹 Вместо долгих цепочек
@Binding / @ObservedObject.Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
❤18👍11✍6
Рекламные пуши добрались и до Wallet. Пользователи iOS сообщают о получении рекламных push-уведомлений от приложения Wallet. Уведомления предлагали скидку на билеты к фильму Apple TV+ «Формула-1».
Многие отмечают, что не давали явного согласия на получение такой рекламы, что потенциально противоречит собственным правилам Apple относительно маркетинговых коммуникаций.
Интересно, что в свежей бета-версии iOS 26 уже обнаружилась настройка для отключения этих самых «Рекламных предложений» в Wallet.
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
🗿22🤯12🔥5👀2
Frame — это прямоугольник, который определяет положение и размер вью относительно её родителя. Он отвечает на вопрос: "Где и какого размера этот элемент находится в родительском контейнере?"
Bounds — это прямоугольник, который описывает внутреннюю систему координат вью. Он отвечает на вопрос: "Какое пространство доступно для отрисовки внутри этого элемента?"
Система координат
🔸 Frame использует систему координат родительского вью.
🔸 Bounds использует собственную систему координат.
Влияние трансформации
🔸 Frame меняется при применении трансформаций (например, при повороте вью он может измениться неопределенным образом).
🔸 Bounds остаётся неизменным при любых трансформациях.
Когда используется
🔸 Frame — когда нужно расположить вью относительно родителя.
🔸 Bounds — когда работаете с внутренним содержимым вью (например, обрезка изображения).
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
👍22❤17🤝7
В iOS-разработке мы часто используем готовые библиотеки или упаковываем свой код для повторного использования. Тут есть два принципиально разных подхода: статические и динамические библиотеки.
🔹 Статические библиотеки (*.a) встраивают весь свой код прямо в бинарник приложения во время компиляции. С одной стороны, это удобно — после сборки приложение не зависит от внешних файлов. С другой — любое изменение в библиотеке потребует полной перекомпиляции проекта.
🔹 Динамические библиотеки (.dylib) работают иначе. Вместо включения в исполняемый файл они подгружаются в момент запуска приложения. Это уменьшает размер основного бинарника и ускоряет запуск (если библиотек немного). Но есть нюанс — если динамических зависимостей слишком много, время старта, наоборот, увеличится.
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
👍23❤12✍5
Новый инструмент Xtool позволяет собирать, подписывать и запускать iOS приложения без Xcode. Как отмечает Томас Рикуар, теперь разрабатывать под iOS можно даже на Linux или Windows — достаточно минимального Swift пакета.
🔸 Открытый билдчейн с полным контролем над процессом сборки.
🔸 Поддержка кроссплатформенной разработки (macOS / Linux / Windows).
🔸 Работает с чистыми Swift пакетами — без Storyboard и xcodeproj.
🔹 Больше не нужен Xcode для базовых задач.
🔹 Сборка на любом ПК — даже без Mac (если есть сертификаты подписи).
🔹 Гибкость CI/CD — можно использовать Linux серверы для сборки iOS приложений.
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
👍23🔥10🤯4
@ObservedObject в SwiftUI.@ObservedObject — это property wrapper, который позволяет подписываться на изменения внешнего объекта данных и автоматически обновлять View при их изменении.
class Counter: ObservableObject {
@Published var value = 0
}
struct CounterView: View {
@ObservedObject var counter: Counter
var body: some View {
Button("+1") { counter.value += 1 }
Text("Значение: \(counter.value)")
}
}
struct ParentView: View {
@StateObject private var counter = Counter()
var body: some View {
CounterView(counter: counter)
}
}
🔸 Автоматическое обновление: View перерисовывается при изменении
@Published свойств.🔸 Локальная область видимости: работает только для конкретного View, куда передан объект.
🔸 Гибкость: можно передавать между View как обычное свойство.
@EnvironmentObject.Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥23👍13❤3
Apple добавила в App Store новый раздел с настройками доступности, где разработчики могут отметить, какие функции поддерживает их приложение. Это помогает пользователям с особыми потребностями быстрее находить подходящие программы.
🔹 Скринридер (VoiceOver) — поддержка озвучивания интерфейса.
🔹 Управление голосом (Voice Control).
🔹 Увеличение текста (Dynamic Type).
🔹 Темная тема (Dark Mode).
🔹 Различие не только цветом (не полагается только на цвет для передачи информации).
🔹 Повышенный контраст (для слабовидящих).
🔹 Уменьшение движения (Reduce Motion).
🔹 Субтитры (скрытые титры для видео).
🔹 Аудиоописание (описание визуального контента).
Разработчик самостоятельно отмечает в App Store Connect, какие функции доступности реализованы в приложении. Apple не проверяет это автоматически — ответственность лежит на команде.
🔸 Пользователи смогут фильтровать приложения по нужным им функциям.
🔸 Разработчики получат дополнительный способ выделить своё приложение.
🔸 Повышение инклюзивности — больше людей смогут комфортно пользоваться приложением.
→ App Store Connect → [Ваше приложение] → Доступность
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
👍24👀14🔥3
Ты часто слышишь: «Нам нужны командные игроки». Но что это на самом деле значит?
Это не про бесконечные митинги и формальные отчёты. И уж точно не про работу в одиночку, под эгидой одной компании.
🔹 Готовность делиться — не только проблемами, но и идеями, знаниями, ресурсами.
🔹 Взаимное уважение — к коллегам, их времени и вкладу в общее дело.
🔹 Поддержка вместо конкуренции — ты не просто «закрываешь свои таски», а помогаешь другим двигаться вперёд.
🔹 Общий результат важнее личных амбиций — успех проекта зависит от всех, а не только от тебя.
«Но у меня мало опыта в больших командах!» — не проблема.
Важно не количество людей вокруг, а твой подход к совместной работе.
🔸 На вопросы наподобие «Расскажите о вашей прошлой работе» нужно подробно рассказать о составе прошлой команды, с кем тебе приходилось взаимодействовать.
🔸 На вопросы вроде «Расскажите какие задачи приходилось решать?» нужно обязательно отвечать о совместных с командой достижениях и решенных проблемах и в меньшей степени о единоличных успехах.
🔸 На вопросы «Как ты делал работу команды эффективнее?» желательно отвечать что-то вроде: «Я инициировал ежедневные созвоны, чтобы быстро решать вопросы, предлагал упрощённые решения, которые экономили время всем, и всегда был на связи, если кому-то нужна была помощь».
🔸 Вопрос «Какой был результат вашей работы?» предполагает ответ вроде: «Мы уложились в дедлайн, избежали лишних доработок, и бизнес заказчик остался доволен итогом работы».
Если у тебя есть опыт наставничества с джунами, мидлами и другими сотрудниками — не скрывай этого!
🔹 Ты не только специалист, но и наставник — можешь развивать команду.
🔹 Ты мыслишь масштабнее — понимаешь, что рост коллег = рост компании.
🔹 Ты умеешь объяснять — а это редкий и ценный навык.
Умение работать с людьми — вот что делает тебя по-настоящему ценным. Настали временна, когда код пишут многие, нужно выделяться и качать софт-скиллы.
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
👍26🔥14❤2👀1
Комьюнити Swift официально запускает Android Workgroup — рабочую группу, которая займётся адаптацией языка под разработку для Android.
🔹 Swift может стать официально поддерживаемым языком для Android.
🔹 Появится возможность писать нативные приложения на Swift под Android (как это уже делает Apple Music).
🔹 Открытая разработка: любой может присоединиться к обсуждениям и вносить правки.
🔸 Поддержка Android в дистрибутиве Swift.
🔸 Адаптация Swift пакетов под Android идиомы.
🔸 Интеграция с Java SDK (взаимодействие Swift и Java кода).
🔸 Система CI/CD для тестирования сборки под Android.
🔸 Отладка Swift кода на Android устройствах.
Сообщество может влиять на процесс через форумы Swift. Членство в группе открыто для всех.
Если инициатива реализуется, разработчики смогут:
🔹 Использовать один язык (Swift) для iOS и Android.
🔹 Переносить код между платформами с минимальными изменениями.
🔹 Упростить поддержку кроссплатформенных проектов.
Пока рано говорить о сроках, но сам факт создания рабочей группы — большой шаг в сторону универсального Swift.
Будем следить за развитием!
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥29👍10👀4
Для тех кто не знал, в Xcode можно быстро убрать из логов сообщения от любых библиотек или системных процессов.
🤔 Зачем это нужно?
🔸 Чище вывод логов при отладке.
🔸 Не отвлекает лишний шум от сторонних зависимостей.
🔸 Работает даже с системными сообщениями.
➡️ Подписаться на канал
Мобильный трудоголик
🔸 Чище вывод логов при отладке.
🔸 Не отвлекает лишний шум от сторонних зависимостей.
🔸 Работает даже с системными сообщениями.
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
👍30🔥10✍4
Главное правило:
Если применяете 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