iOS Dev
7.6K subscribers
983 photos
79 videos
1 file
1.13K links
🍏Канал об iOS-разработке, необычных подходах и решениях.
👨‍💻Автор: Виктор Грушевский (@Viktorianec)
Темы:
⭐️ Подготовка к собеседованиям.
⭐️ Архитектуры и алгоритмы.
⭐️ Код. Много кода.

⚒️База знаний: https://boosty.to/ios_dev

#ios #mobile #swift
加入频道
Обнаружение и устранение зависаний в приложениях для iOS

📖 В этой статье рассмотрена одна из самых частых причин снижения производительности в iOS-приложениях.

Спойлер: причина в сложных вычислениях в главном потоке.

Рассказано, как обнаружить зависание используя App Hangs Detection и Instruments, смоделирован сценарий зависания интерфейса в проекте SwiftUI и продемонстрированы шаги для устранения этой проблемы.

Большой разбор возможных кейсов проблем с производительностью, причин зависаний и способов предотвращения такого поведения есть 💰тут и ⭐️ прямо здесь.

😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Динамическая адаптация к доступному пространству с помощью ViewThatFits

ViewThatFits - это компонент SwiftUI, доступный с iOS 16.

Вкратце принцип работы следующий: ViewThatFits выбирает первое child view, чей идеальный размер по заданным осям впишется в предложенный размер.

Обычно это происходит в порядке от наибольшего к наименьшему, но, так как наше вью иногда может поместиться только вдоль одной оси, порядок может быть нарушен.

По умолчанию ViewThatFits ограничивается по горизонтальной и вертикальной осям.

📖 Неплохой пример использования ViewThatFits есть тут и в официальной документации.

😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Стратегии, позволяющие избежать мерж-конфликтов в проектах Xcode

Каждый, кто работал в более-менее большой команде разработчиков (что уж там, даже двоих человек иногда достаточно), наверняка сталкивался с конфликтами при слиянии изменений.

📖 Tuist выпустили неплохой материал с разбором, почему такие проблемы вообще возникают, и как с этим может быть связан файл project.pbxproj в Xcode.

А ещё они описали несколько вариантов решения: от использования workspace и SwiftPM до buildable folders в Xcode 16.

🔗 Кстати, вот тут можно познакомиться и с другими возможными причинами мерж-конфликтов.

😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
Как улучшить архитектуру кода с помощью принципов SOLID (с примерами на Swift)

Эти принципы помогают сократить количество хаоса на проекте с течением времени. Да и следование SOLID облегчает в целом сопровождение кода, тестирование и потенциальное масштабирование.

Наш читатель Максим Егоров (уже знакомый вам по примеру работы с Network-фреймворком) в этот раз решил затронуть базу и показал на несложных примерах потенциальные ошибки, которые могут нарушать принципы, сформулированные Робертом Мартином, а ещё привёл варианты их исправления.

📖 Прочитать статью целиком можно здесь.

🧠 Напомню, что в приложении вы можете проверить себя не только в знании этих принципов, но и в других важных темах.

😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Spectrum ring — реализация на Metal в iOS

В рамках экспериментов по изучению возможностей шейдеров попробовал разложить несколько цветов в непрерывный ряд (и дополнил парой красивых эффектов).

Варианты использования спектра вообще довольно значительны (от стандартного colorPicker в iOS до реализации самых разных волн и анимаций в музыкальных плеерах).

Реализация, референсы и код на SwiftUI+Metal уже доступен 💰тут и ⭐️ в телеграм.

🎆 В канале доступны и другие красивые эффекты.

😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
Swift init() - особенности, примеры использования и подводные камни

📖 Статья, на первый взгляд полезная новичкам, на самом деле описывает несколько проблем, с которыми могут столкнуться разработчики.

Кирилл, который уже делился своим разбором Grand Central Dispatch, акцентирует внимание на нескольких важных аспектах.

Например, почему UIView.init() всегда вызывается без параметров, а init(frame:) и init(coder:) переопределяются. Или, например, когда именно нужен required-инициализатор.

Статья разбита на следующие логические блоки:

Работа со структурами:
- Memberwise initializer.
- Optionals, var vs let.
- Retaining a memberwise initializer.

Работа с классами:
- Designated initializer.
- Convenience initializer.
- Уменьшаем количество override.
- Помощь компилятора.
- required initializer: дженерики, протоколы, Self(), final.
- UIView() и что скрывает документация.

😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
Разделение или работа в команде

Удивительно, как в нескольких компаниях сразу идеи о том, как важно отделять рабочее от всего остального, вышли буквально на мировой уровень.

📺 Несколько лет назад появился сериал Разделение, о котором я даже написал пару строк (и по случайному совпадению он завершал один из небольших квестов в нашем канале).
К слову, линия мистера Милчека с его перфоманс-ревью и последующей рефлексией возможно найдет ответ и у некоторых разработчиков.

🎮 А ведь кроме этого вышла сначала it takes two, а в этом году не менее чудесная Split Fiction, в которой, к слову, секретное послание оставил и геймдизайнер.

Пожалуй, крайне важная часть — умение работать в команде, ведь далеко не всегда всё зависит от мобильного клиента, или конкретно от разработчика.

Тесное взаимодействие команд дизайна, тестирования, реализации на сервере и формирование продуктовых задач, которые попадают в спринт достигается за счёт синергии всех участников процесса.

Кроме этого, одна из основных составляющих нашей работы состоит как раз в сложности разделения.

Тяжело перестать думать о баге или какой-нибудь важной фиче, которую вот-вот и вы выкатите на прод, особенно перед релизом.

И это может влиять и на менталку, и на какие-то дела вне работы. Поэтому довольно важно научиться разделять рабочие моменты и все, что находится за пределами, какой бы сложной и важной та или иная не казалась на первый взгляд.

🔄 Главное помнить, что умение переключать контекст - важнейший скилл. Не только в работе, но и в жизни.

И это далеко не самый простой навык.

😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
ℹ️ Вышел первый стабильный релиз Swiftly - официального менеджера версий Swift

Хотя актуальный релиз Swift по дефолту включен в Xcode, иногда может понадобиться другая версия для создания сервисов или, например, каких-либо инструментов командной строки.

Установка надежной версии Swift (с нужными зависимостями) требовала действий вручную, которые, очевидно, могли приводить к ошибкам.

🛠 В этом релизе swiftly стал частью Swift toolchain.

Кроме этого, добавлена и поддержка macOS для того, чтобы сделать возможной установку Swift отдельно от Xcode.

Среди базовых фич:

➡️ Установка нескольких тулчейнов (и стабильные релизы, и снэпшоты).
➡️ Обновление установленных тулчейнов до актуальной версии.
➡️ Проверка доступных для установки тулчейнов с помощью list-available.
➡️ Совместное использование предпочитаемого тулчейна в качестве настройки проекта с помощью файла .swift-version.
➡️ Выполнение заданной команды с помощью подкоманды run.

📖 Официальная новость на сайте Swift.

😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
Архитектура SwiftData: паттерны и практики

SwiftData ознаменовала важный шаг вперёд в области хранения данных. Она была призвана заменить Core Data чем-то более интуитивным: тем, что будет проще интегрировать в SwiftUI.

Однако осталось несколько важных вопросов.

Как именно мы должны проектировать приложение на её основе?

Должны ли мы целиком полагаться на @Model и @Query, или можно абстрагировать их за протоколами для обеспечения гибкости? Как быть с бизнес-логикой? Да и как в целом нужно структурировать код для обеспечения надёжности и тестируемости в будущем.

📖 В этой масштабной статье можно узнать ответы на эти и другие вопросы:

🔘 Как структурировать модели данных
🔘 Где разместить бизнес-логику
🔘 Как писать модульные тесты
🔘 Как настроить работу Preview в Xcode
🔘 Как интегрировать CloudKit
🔘 Как работать с изменениями в слоях в будущем.

😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
Вышел Xcode 16.3 с нативной интеграцией вайб-кодинга!

Ночью вышел Xcode 16.3 и Swift 6.1, а вместе с ним и новый режим программирования.

На этой неделе в Европе официально разрешили Apple Intelligence и Тим Кук просто шокировал общественность, написав в X:

«Нам пришлось принять сложное решение. Всё больше разработчиков стало доверять ИИ, всё больше процессов интегрируется и вместе с тем мы вынуждены сохранять гонку не только с Google и OpenAI, но и с самим временем. Поэтому мы решили выпустить из беты режим вайб-кодинга в Xcode. Никакого Leetcode, никаких мыслей, теперь только х-к, х-к и в продакшн (какие-то буквы, к сожалению, пропущены).»

Буквально месяц назад Сергей Брин призвал ходить коллег в офис и работать 60 часов в неделю, но Apple сыграли на опережение как всегда. Разработчики в Купертино сидели по 120 часов с понедельника по субботу, приходя в 4 утра.

Новая инновация уже вызвала целую волну сокращений в Кремниевой долине и даже затронула бигтехи в РФ.

Сообщества с десятками тысяч читателей уже запустили курсы по подписке, как обойти новые процессы собеседований.

Теперь они предлагают работать и скручивать опыт, ведь как известно, для работы с новым ИИ теперь необходимо как можно меньше навыков. Чистое, незамутнённое алгоритмами сознание теперь имеет преимущество перед разработчиками с 10+ опыта.

Тим Кук добавил, что новый режим стал частью долгосрочного плана и подчеркнул, что канал iOSDev всё знал ещё два года назад.

😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
Современные практики для работы с URL в Swift

Использование современных API в Foundation для построения (и дальнейшей работы) с URL не только упрощает наш код, но и снижает риск возникновения ошибок и возможных крашей.

📖 В своей статье Джон Санделл разбирает импакт от StaticString, макросов, как прийти к виду let url = #staticURL("https://yangx.top/iosdev"), например, а также опции построения сложных запросов с помощью фич из iOS 16.

Кстати, про особенности и свойства URLSession можно узнать из этого поста.

😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Эффект свечения текста в комбинации с numericText

Показал пример несложной анимации, при этом довольно приятной по ощущениям (нужен массив с несколькими цветами, несколько теней и contentTransition с numericText).

Код этого и других примеров (в том числе с Metal доступен 💰тут и ⭐️ в телеграм).

😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
WWDC25

К сожалению, в этом году лотерея была не на моей стороне. С другой стороны - будет больше времени на то, чтобы детальнее рассмотреть все фичи.

🐱 Кстати, если кто планирует ехать, в эти дни в Сан-Франциско будет как минимум CommunityKit-конфа и OneMoreThing (если её решатся провести снова).

А мне пока остаётся смотреть на старые фотки из Apple Visitor Center.

Если кому-то выпало нормально очков удачи и вы выиграли билет на ивент, поделитесь радостью в комментариях)

😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
Как на самом деле работает Swift Concurrency

📖 Виталий Батраков в своём блоге рассказывает о том, что такое асинхронные функции, как создавать и работать с Task и не только.

Например, в статье разбираются Default concurrent/Serial/Main executors и как именно они формируют общую картину.

🔗 Напомню, в канале есть и глоссарий по Swift Concurrency.

Кстати, здесь можно проверить свои силы в вопросах на примерах кода (в приложении часть из них тоже есть).

😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Работа с модификатором task в SwiftUI: примеры, особенности, приоритеты

➡️ Модификатор task можно использовать в качестве инструмента для выполнения асинхронного кода.

Как рекомендует автор следующего материала, стоит задуматься о применении этого модификатора в частности для случаев, когда есть комбинация отдельных блоков onAppear и Task.

📖 В этой статье рассмотрены различные опции использования task в реальном проекте.

🛠 А вот тут можно посмотреть на этот проект.

😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
SharingGRDB — альтернатива для SwiftData от авторов Point-Free

По факту это слияние либы Sharing и GRDB.swift (от Гвендаля Руэ), в котором есть целый набор инструментов, которые могут заменить многие сценарии использования SwiftData.

SharingGRDB даёт прямой доступ к базовому SQLite (включая джойны, aggregate-запросы и многое другое).

📖 Документация и примеры запросов.

Примеры проектов:

1️⃣ Case Studies - примеры, показывающие фичи либы.
2️⃣ SyncUps - по факту ребилд приложения Scrumdinger от Apple.
3️⃣ Reminders - приложение с напоминаниями, списками и тегами.

🔗 Ссылка на репозиторий.

😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM