uk
Feedback
iOS Dev

iOS Dev

Відкрити в Telegram

👨‍💻Автор: Виктор Грушевский (@Viktorianec) ⚒️ База: https://boosty.to/ios_dev | 🤖 @iOSIQBot | https://iosiq.ru 🍏Канал об iOS-разработке, алгоритмах и архитектурах ⭐️ Подготовка к собесам ⭐️ Код. Много кода. #ios #mobile #swift

Показати більше
7 879
Підписники
+124 години
-17 днів
-5130 день
Архів дописів
iOS Dev
7 879
Как вы относитесь к перфоманс ревью?
Anonymous voting

iOS Dev
7 879
Создание крупномасштабных приложений на SwiftUI: Руководство по модульной архитектуре Архитектура — это всегда тема для жарки
Создание крупномасштабных приложений на SwiftUI: Руководство по модульной архитектуре Архитектура — это всегда тема для жарких споров, особенно когда у нас есть много вариантов. В фундаментальной статье вы сможете найти: 🔗 Что представляет собой модульная архитектура? 🔗 Какие могут быть проблемы с MVVM со SwiftUI 🔗 Как можно понимать паттерн MV 🔗 Screens vs Views (плюсы и минусы наименований) 🔗 Примеры создания и использования моделей 🔗 View-специализированная логика 🔗 Валидация 🔗 Навигацияпример с TabView) 🔗 Отображение ошибок 🔗 Группировка событий 🔗 Форматирование 🔗 Тестирование В канале уже были примеры и других реализаций, напомню про эти посты: 1️⃣ Реализация модульной архитектуры на примере Spotify 2️⃣ Опенсорсный клиент на SwiftUI для Mastodon: демонстрация реализованных методов и фич 3️⃣ Пример реализации модульной архитектуры в компании Just Eat И, конечно, если вы хотите найти ещё больше информации, примеров и разборов конкретных архитектур, подписывайтесь: 💰 Boosty • 💬 Telegram 😃 iOS Dev

iOS Dev
7 879
AVAudioEffectNode: создание низкоуровневых аудиоэффектов в Swift При создании аудиоэффектов можно использовать Audio Units. И
AVAudioEffectNode: создание низкоуровневых аудиоэффектов в Swift При создании аудиоэффектов можно использовать Audio Units. И хотя Apple предоставляет примеры того, как это сделать, они могут быть сложными для новичков. Следуя аналогичному подходу из либы Novocaine, автор делится примером удобного API для создания аудиоэффектов в Swift с помощью AVFoundation. 📖 Исследование доступно здесь, а код — вот тут. ✅Ещё больше эффектов, анимаций и разборов кода вы можете получить здесь. 😃 iOS Dev

iOS Dev
7 879
Что тормозит карьеру в разработке? На митапе от «Лаборатории Касперского» эксперты в мобильной разработке поделятся реальными
Что тормозит карьеру в разработке? На митапе от «Лаборатории Касперского» эксперты в мобильной разработке поделятся реальными примерами карьерных ошибок и подскажут, как их избежать. Вместе с профессионалами вы узнаете, что делать, чтобы двигаться вперед без задержек и тупиков. Присоединяйтесь, чтобы: ✅ избежать ошибок, мешающих карьерному росту; ✅ избавиться от основных сложностей развития в профессии; ✅ увидеть, как эффективно развиваться в IT-индустрии; ✅ отрефлексировать свою карьеру. Когда: 26 сентября в 16:00 Формат: Онлайн Регистрируйся здесь: https://kas.pr/r9nw?erid=LjN8K36or На митапе вы получите практические советы и конкретные шаги для успешного роста в IT.

iOS Dev
7 879
Создание секундомера и таймера на базе SystemFormatStyles в Xcode 16 Вкратце, стили форматирования (format styles) — это заме
Создание секундомера и таймера на базе SystemFormatStyles в Xcode 16 Вкратце, стили форматирования (format styles) — это замена на Swift старых классов Objective-C Formatter от Apple. Они позволяют быстро и легко создавать локализованные отображения различных типов данных. Они безопасны, производительны и очень просты в использовании в коде для преобразования одного типа в другой. Но документация Apple не всегда описывает все нововведения сразу же (или вообще никогда). 📖 В этом примере уже сейчас можно познакомиться с двумя новыми стилями SystemFormatStyle.Stopwatch и SystemFormatStyle.Timer. 😃 iOS Dev

iOS Dev
7 879
🚀 Swift 6 официально анонсирован! И хотя мы с вами используем язык для разработки приложений, он подходит и для много другого: написания библиотек, интернет-сервисов и критичного к производительности и безопасности кода. Swift 6 расширился ещё и за счёт новых функций низкоуровневого программирования, расширенной поддержки Linux и Windows, новых кроссплатформенным API, включая новую библиотеку тестирования Swift. 📖 На макро-уровне изменения разобраны в этой статье. А в канале уже сейчас можно прочитать про: 🔗 Новый метод count(where:) в Swift 6 🔗 DebugDescription в Xcode 16: новый макрос для упрощения отладки 🔗 Обновлённый Foundation 🔗 Swift Testing: Разбор API и макроса #expect 🔗 Миграция на Swift 6. И ещё: Swift 6: подготовка ваших проектов Xcode к будущему 😃 iOS Dev

iOS Dev
7 879
Кастомизация тем в SwiftUI с использованием ShapeStyle В SwiftUI настройка внешнего вида приложения на базе кастомной темы бе
Кастомизация тем в SwiftUI с использованием ShapeStyle В SwiftUI настройка внешнего вида приложения на базе кастомной темы безусловно улучшит пользовательский опыт. Первоначальный подход к управлению этими настройками предполагает монотонное повторение одних и тех же действий для разных экранов. 📖 В этой статье рассмотрен способ с использованием кастомного ShapeStyle для создания собственных тем во всем приложении. 😃 iOS Dev

iOS Dev
7 879
Подборка вопросов по Swift и iOS с технических собеседований 2024 Я продолжаю обновлять базу знаний, а также собирать материалы (и новые темы) для будущего обновления приложения iOS IQ. Сегодня готов поделиться здесь огромным материалом (а в ноушене комментариями, дополнениями и примерами). 1. В чем разница между статической переменной и переменной класса? Почему их природа схожа, и при чём здесь наследование? 2. Вычисляются ли ленивые переменные более одного раза? И почему потокобезопасность важна. 3. В чём разница между self и Self? Разница же в Swift заключается в их использовании и контексте. Если вы писали на других языках, то наверняка знаете для чего там использовался this или typeof (в ноушне много примеров). 4. Как сделать методы опциональными в протоколе? Есть два подхода - optional и extension (а вот как их использовать - в разборе вот здесь). 5. Как происходит оптимизация использования памяти в UITableView? В канале я регулярно делюсь проблемами и решениями для оптимизации. Например, как быть, если у нас очень много ячеек. В Notion есть пример разбора и таких ситуаций. 6. Что такое Dependency Injection и каковы его преимущества? Здесь, как вы уже догадались, речь про Constructor injection/Property injection/Method injection. Ну и про описание преимуществ, конечно. 7. Объясните разницу между throws и rethrows в Swift Как правильно использовать do-catch и многое другое. 8. Объясните типы сессий и задач, поддерживаемые классом URLSession. Default Session/Ephemeral Session/Background Session. В этой теме рассмотрено, есть ли у нас способ повторить неудавшиеся запросы. 9. Сравните статические и динамические библиотеки Про то, что может включать каждый тип либ, что происходит при компиляции, как быть с обновлениями. 10. Как бы вы реализовали список с бесконечной прокруткой? Большой разбор на примерах. 11. Что такое copy-on-write в Swift? Объясните, как настроить его реализацию. Конечно, эта техника позволяет значительно сократить использование памяти и повысить производительность. Но вот что внутри? 12. Объясните, как используется паттерн Factory и какую проблему решает этот паттерн. Тут можно не забыть об использовании этой подборки 13. Что такое APNS и как он работает? 14. Объясните назначение ключевого слова «mutating» в Swift. 15. В чем разница между @StateObject и @ObservedObject в SwiftUI? 16. Что такое Mocks и Stubs и в чем разница между ними? Назначение/Поведение/Использование. 17. Объясните протоколы Equatable, Hashable и Comparable в Swift. 18. Что означает UIApplicationMain? 19. Объясните, почему Swift является типобезопасным языком? Все о Strong Type, Type Inference, Type Casting, optional, дженериках. 20. Зачем вам нужны escaping closures и когда их следует использовать? ✅Напомню, что в бусти продолжает действовать выгодное предложение (а если вам нравится канал — то ещё и здесь, в телеграм), и вы уже сейчас можете получить доступ не только к этому материалу, но и к большому количеству тем для собеседований и разбору практических задач. 😃 iOS Dev

iOS Dev
7 879
Оптимизация использования памяти для SwiftUI+CoreData Несмотря на наличие lazy containers в SwiftUI, и в целом механизмов для
Оптимизация использования памяти для SwiftUI+CoreData Несмотря на наличие lazy containers в SwiftUI, и в целом механизмов для оптимизации CoreData, по мере увеличения сложности приложений могут возникнуть ситуации, когда можно поймать краши из-за слишком большого использования памяти. Важно понимать не только особенности работы с вьюхами, но и свойства самой CoreData. 📖 В этом проекте рассмотрен пошаговый процесс оптимизации работы с памятью для демонстрационного приложения (изначально использующего 1,6 ГБ памяти для отображения всего лишь 100 элементов данных), которое в итоге сможет работать с сотнями объектов и юзать всего 200 МБ. 🛠 Код приложения доступен на GitHub. ✅Кстати, если вы хотите почитать в целом про память: ARC, side table, флаги, утечки и многое другое (и поотвечать на вопросы) — доступ можно получить здесь. 😃 iOS Dev

iOS Dev
7 879
Обновление App Store Connect C сегодняшнего дня обязателен только один набор скриншотов для приложений (и для iPhone, и для i
Обновление App Store Connect C сегодняшнего дня обязателен только один набор скриншотов для приложений (и для iPhone, и для iPad). 🤩 Теперь выкладывать приложения будет проще (и быстрее). 😃 iOS Dev

iOS Dev
7 879
Swift Testing: Разбор API и макроса #expect Новый понятный и выразительный API делает написание тестов более простым, а в сам
Swift Testing: Разбор API и макроса #expect Новый понятный и выразительный API делает написание тестов более простым, а в самом интерфейсе Xcode сделали большой шаг вперёд для оповещений при ошибках (или же корректном выполнении). 📖 В этой статье уделено внимание написанию тестов с использованием новых возможностей, а также разобрана миграция с XCTests. 🔗 А вот тут можно детальнее познакомиться с улучшениями и преимуществами по сравнению с XCTests. 😃 iOS Dev

iOS Dev
7 879
Camera Control в iPhone16: AVCaptureControl и фреймворк LockedCameraCapture Буквально вчера показали новый телефон, а у нас у
Camera Control в iPhone16: AVCaptureControl и фреймворк LockedCameraCapture Буквально вчера показали новый телефон, а у нас уже появился новый островок новый контрол, с которым можно работать. 📖 На официальной странице Apple можно познакомиться с лучшими практиками в плане дизайна. А из того, что нам может пригодиться: 1️⃣ AVCaptureControl — новый контрол только для 16/16 Pro (примеры работы - тут). 2️⃣ LockedCameraCapture — новый фреймворк, с помощью которого можно создать расширение для запуска камеры на залоченном девайсе. Туториал уже доступен (но, как и всегда, есть ряд ограничений). 😃 iOS Dev

iOS Dev
7 879
Планируете что-то обновить после презентации?
Anonymous voting

iOS Dev
7 879
Архитектурная секция на собеседованиях Команда мобильной разработки Яндекс 360 записала пример прохождения архитектурной секц
Архитектурная секция на собеседованиях Команда мобильной разработки Яндекс 360 записала пример прохождения архитектурной секции в Яндекс. В интервью участвуют руководитель технического управления сервисами Виктор Брыксин, а в роли кандидата — руководитель мобильной разработки Михаил Буравлев. В тестовом задании нужно было спроектировать абстрактное мобильное приложение для медитаций: с отдельным экраном для списка треков, возможностью воспроизведения аудиозаписей, упрощённым календарём и пуш-уведомлениями. После этого нужно было поработать с требованиями, архитектурой и API, а также показать ход мысли и защитить свои решения. Забирайте наглядный пример прохождения секции! Смотреть на Youtube Смотреть в ВК

iOS Dev
7 879
Работа с JSON в Swift: расширенное руководство Парсинг JSON чаще всего является базой приложения для iOS, использующим REST A
Работа с JSON в Swift: расширенное руководство Парсинг JSON чаще всего является базой приложения для iOS, использующим REST API. Делюсь руководством, которое поможет освежить знания (состоит из нескольких глав, в каждой их которых подразделы с примерами). 1️⃣ Как работать с данными JSON в Swift. 2️⃣ Продвинутые техники для парсинга сложных данных. 3️⃣ Создание приложения SwiftUI, которое загружает и парсит JSON. 🛠 Проект целиком доступен и на github. 🔗 А вот тут я писал про четыре полезных сервиса для упрощения работы с JSON. 😃 iOS Dev

iOS Dev
7 879
Как автоматически локализовать секцию «Что нового?» с помощью App Store connect API При создании новой версии приложения в Ap
Как автоматически локализовать секцию «Что нового?» с помощью App Store connect API При создании новой версии приложения в App Store Connect мы обязаны указывать какую-то инфу, которая меняется нечасто (конечно, если у вас нет SMM-команды, которая отвечает за юмор и репосты скриншотов). Раньше для этого повсеместно использовали fastlane, но сейчас всё чаще я слышу от коллег о переходе на нативное апи (некоторые пишут свою обёртку, некоторые используют готовые решения). Эти способы позволяют сэкономить немного времени, усилий и устранить человеческие ошибки. 📖 В этой статье рассказано, как использовать API App Store Connect для предварительного указания информации при создании новой версии приложения. 🔗 А вот здесь описаны и другие кейсы использования этого API. 😃 iOS Dev

iOS Dev
7 879
Работа с данными банковских приложений на iOS с использованием SwiftUI + Vision Одна из перспективных задач при работе с любы
Работа с данными банковских приложений на iOS с использованием SwiftUI + Vision Одна из перспективных задач при работе с любыми приложениями — упрощение ввода, так как это экономия времени, сил и способ избежать потенциальных ошибок. Но у того же FinanceKit есть множество ограничений: минимальная ось 17.4 и требования к самим компаниям, да и пользователи вряд ли захотят делиться своими данными. 🧑‍💻 Наш читатель, Слава Слуцкер, придумал необычный и интересный способ для решения задачи сбора данных о кэшбеке из разных источников на базе скриншотов (но, конечно, потенциал использования выше). Для этого он использовал связку Vision (для распознавания определённых строк и дальнейшего парсинга процентов) и SwiftUI. Vision умеет работать в том числе и с разными языками, что безусловный плюс, а ещё прямо на устройстве. 📖 В статье на хабре вы можете почитать о процессе решения этой задачи, познакомиться с кодом и, возможно, использовать это в своих приложениях. Кстати, посмотреть результат (и поделиться фидбэком) можно в тестфлайте. 😃 iOS Dev

iOS Dev
7 879
DebugDescription в Xcode 16: новый макрос для упрощения отладки При работе с кастомными типами отладка может быть непростой з
DebugDescription в Xcode 16: новый макрос для упрощения отладки При работе с кастомными типами отладка может быть непростой задачей. Для упрощения можно юзать CustomDebugStringConvertible, который позволяет кастомизировать вывод в таких случаях. А с помощью макроса DebugDescription, можно вызвать debugDescription и чекнуть детальное описание. 😃 iOS Dev

iOS Dev
7 879
SwiftUI AlignmentGuide: расширенное руководство 📖 На хабре опубликована большая статья с примерами для работы с модификаторо
SwiftUI AlignmentGuide: расширенное руководство 📖 На хабре опубликована большая статья с примерами для работы с модификатором AlignmentGuide, описано, когда могут пригодиться ViewDimensions и какие есть альтернативы. 🛠А ещё есть интерактивный сайт, где можно посмотреть не только на самые разные примеры верстки, но и поперетаскивать блоки. 😃 iOS Dev

iOS Dev
7 879
Получение флага страны в виде эмодзи в Swift Часто требуется отобразить эмодзи для страны по её коду. Флаги Emoji представлен
Получение флага страны в виде эмодзи в Swift Часто требуется отобразить эмодзи для страны по её коду. Флаги Emoji представлены с помощью последовательностей символов в unicode. Удивительно, но юникодовое представление каждого флага напрямую соотносится с кодом по стандарту ISO (ISO 3166-1 alpha-2). Конечно, есть соблазн использовать что-то вроде:
let flags: [String: String] = ["AD": "🇦🇩", "AE": "🇦🇪", "AF": "🇦🇫", "AG": "🇦🇬", "AI": "🇦🇮", "AL": "🇦🇱", "AM": "🇦🇲", "AO": "🇦🇴", "AQ": "🇦🇶", "AR": "🇦🇷", "AS": "🇦🇸", "AT": "🇦🇹", "AU": "🇦🇺", "AW": "🇦🇼", "AX": "🇦🇽", "AZ": "🇦🇿", "BA": "🇧🇦", "BB": "🇧🇧", "BD": "🇧🇩", "BE": "🇧🇪", "BF": "🇧🇫", "BG": "🇧🇬", "BH": "🇧🇭", "BI": "🇧🇮", "BJ": "🇧🇯", "BL": "🇧🇱", "BM": "🇧🇲", "BN": "🇧🇳", "BO": "🇧🇴", "BQ": "🇧🇶", "BR": "🇧🇷", "BS": "🇧🇸", "BT": "🇧🇹", "BV": "🇧🇻", "BW": "🇧🇼", "BY": "🇧🇾", "BZ": "🇧🇿", "CA": "🇨🇦", "CC": "🇨🇨", "CD": "🇨🇩", "CF": "🇨🇫", "CG": "🇨🇬", "CH": "🇨🇭", "CI": "🇨🇮", "CK": "🇨🇰", "CL": "🇨🇱", "CM": "🇨🇲", "CN": "🇨🇳", "CO": "🇨🇴", "CR": "🇨🇷", "CU": "🇨🇺", "CV": "🇨🇻", "CW": "🇨🇼", "CX": "🇨🇽", "CY": "🇨🇾", "CZ": "🇨🇿", "DE": "🇩🇪", "DJ": "🇩🇯", "DK": "🇩🇰", "DM": "🇩🇲", "DO": "🇩🇴", "DZ": "🇩🇿", "EC": "🇪🇨", "EE": "🇪🇪", "EG": "🇪🇬", "EH": "🇪🇭", "ER": "🇪🇷", "ES": "🇪🇸", "ET": "🇪🇹", "FI": "🇫🇮", "FJ": "🇫🇯", "FK": "🇫🇰", "FM": "🇫🇲", "FO": "🇫🇴", "FR": "🇫🇷", "GA": "🇬🇦", "GB": "🇬🇧", "GD": "🇬🇩", "GE": "🇬🇪", "GF": "🇬🇫", "GG": "🇬🇬", "GH": "🇬🇭", "GI": "🇬🇮", "GL": "🇬🇱", "GM": "🇬🇲", "GN": "🇬🇳", "GP": "🇬🇵", "GQ": "🇬🇶", "GR": "🇬🇷", "GS": "🇬🇸", "GT": "🇬🇹", "GU": "🇬🇺", "GW": "🇬🇼", "GY": "🇬🇾", "HK": "🇭🇰", "HM": "🇭🇲", "HN": "🇭🇳", "HR": "🇭🇷", "HT": "🇭🇹", "HU": "🇭🇺", "ID": "🇮🇩", "IE": "🇮🇪", "IL": "🇮🇱", "IM": "🇮🇲", "IN": "🇮🇳", "IO": "🇮🇴", "IQ": "🇮🇶", "IR": "🇮🇷", "IS": "🇮🇸", "IT": "🇮🇹", "JE": "🇯🇪", "JM": "🇯🇲", "JO": "🇯🇴", "JP": "🇯🇵", "KE": "🇰🇪", "KG": "🇰🇬", "KH": "🇰🇭", "KI": "🇰🇮", "KM": "🇰🇲", "KN": "🇰🇳", "KP": "🇰🇵", "KR": "🇰🇷", "KW": "🇰🇼", "KY": "🇰🇾", "KZ": "🇰🇿", "LA": "🇱🇦", "LB": "🇱🇧", "LC": "🇱🇨", "LI": "🇱🇮", "LK": "🇱🇰", "LR": "🇱🇷", "LS": "🇱🇸", "LT": "🇱🇹", "LU": "🇱🇺", "LV": "🇱🇻", "LY": "🇱🇾", "MA": "🇲🇦", "MC": "🇲🇨", "MD": "🇲🇩", "ME": "🇲🇪", "MF": "🇲🇫", "MG": "🇲🇬", "MH": "🇲🇭", "MK": "🇲🇰", "ML": "🇲🇱", "MM": "🇲🇲", "MN": "🇲🇳", "MO": "🇲🇴", "MP": "🇲🇵", "MQ": "🇲🇶", "MR": "🇲🇷", "MS": "🇲🇸", "MT": "🇲🇹", "MU": "🇲🇺", "MV": "🇲🇻", "MW": "🇲🇼", "MX": "🇲🇽", "MY": "🇲🇾", "MZ": "🇲🇿", "NA": "🇳🇦", "NC": "🇳🇨", "NE": "🇳🇪", "NF": "🇳🇫", "NG": "🇳🇬", "NI": "🇳🇮", "NL": "🇳🇱", "NO": "🇳🇴", "NP": "🇳🇵", "NR": "🇳🇷", "NU": "🇳🇺", "NZ": "🇳🇿", "OM": "🇴🇲", "PA": "🇵🇦", "PE": "🇵🇪", "PF": "🇵🇫", "PG": "🇵🇬", "PH": "🇵🇭", "PK": "🇵🇰", "PL": "🇵🇱", "PM": "🇵🇲", "PN": "🇵🇳", "PR": "🇵🇷", "PS": "🇵🇸", "PT": "🇵🇹", "PW": "🇵🇼", "PY": "🇵🇾", "QA": "🇶🇦", "RE": "🇷🇪", "RO": "🇷🇴", "RS": "🇷🇸", "RU": "🇷🇺", "RW": "🇷🇼", "SA": "🇸🇦", "SB": "🇸🇧", "SC": "🇸🇨", "SD": "🇸🇩", "SE": "🇸🇪", "SG": "🇸🇬", "SH": "🇸🇭", "SI": "🇸🇮", "SJ": "🇸🇯", "SK": "🇸🇰", "SL": "🇸🇱", "SM": "🇸🇲", "SN": "🇸🇳", "SO": "🇸🇴", "SR": "🇸🇷", "SS": "🇸🇸", "ST": "🇸🇹", "SV": "🇸🇻", "SX": "🇸🇽", "SY": "🇸🇾", "SZ": "🇸🇿", "TC": "🇹🇨", "TD": "🇹🇩", "TF": "🇹🇫", "TG": "🇹🇬", "TH": "🇹🇭", "TJ": "🇹🇯", "TK": "🇹🇰", "TL": "🇹🇱", "TM": "🇹🇲", "TN": "🇹🇳", "TO": "🇹🇴", "TR": "🇹🇷", "TT": "🇹🇹", "TV": "🇹🇻", "TW": "🇹🇼", "TZ": "🇹🇿", "UA": "🇺🇦", "UG": "🇺🇬", "UM": "🇺🇲", "US": "🇺🇸", "UY": "🇺🇾", "UZ": "🇺🇿", "VA": "🇻🇦", "VC": "🇻🇨", "VE": "🇻🇪", "VG": "🇻🇬", "VI": "🇻🇮", "VN": "🇻🇳", "VU": "🇻🇺", "WF": "🇼🇫", "WS": "🇼🇸", "YE": "🇾🇪", "YT": "🇾🇹", "ZA": "🇿🇦", "ZM": "🇿🇲", "ZW": "🇿🇼"]
Но есть и другой путь. 📖 В этом материале разбираются не только принципы получения эмодзи, но и затронуты неочевидные моменты для разных стандартов. 😃 iOS Dev