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

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

#ios #mobile #swift
Download Telegram
Парсинг JSON в Swift: объяснение с примерами кода
Статья рассчитана на новичков, которым полезно начать с базы для разбора основных принципов

🤔 Парсинг JSON в Swift — обычное дело, встречающееся едва ли не в каждом втором (а может и в в каждом) проекте.

В целом, декодирование JSON в Swift довольно простое и не требует никаких внешних зависимостей.

📖 Базовых API, поставляемых со Swift, будет достаточно для выполнения этой работы, а в этом материале рассказывается о следующих понятиях:

1️⃣ Основы декодирования JSON.

2️⃣ Декодирование JSON-массивов в Swift.

3️⃣ Сопоставление ключей (или же маппинг) JSON с кастомными свойствами.

4️⃣ Декодирование дат JSON с кастомными форматами (например, датой, включая возможные стратегии).

@iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
Время очередной интересной истории
Попробую вас удивить, а вы постарайтесь догадаться, о чём идёт речь

1️⃣ Этот символ появляется на ряде древних предметов в Северной Европе.

2️⃣ Он занимает видное место на картинном камне из Хаблингбо в Швеции, который был создан между 400 и 600 годами нашей эры.

3️⃣ Он также похож на традиционную геральдическую эмблему, называемую узлом Боуэна.

4️⃣ В Финляндии этот символ рисовали или вырезали на домах и амбарах, а также на домашней утвари, такой как посуда, чтобы защитить их и их владельцев от злых духов и неудач.

5️⃣ Самый старый сохранившийся пример — пара деревянных лыж возрастом 1000 лет (финский дохристианский период), украшенных этим символом.

🤔 Всё ещё не догадались, о чём я веду речь?

Этот символ также появляется на артефактах культуры Миссисипи на юго-востоке Соединенных Штатов.

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

📕 Всё ещё нет?

Английские названия Saint John's Arms, Saint Hannes cross или Saint Hannes's Cross, а также скандинавские названия относятся к Иоанну Крестителю.

Все эти подсказки, и вся информация об этом должны были навести вас на мысль, что я рассказывал о:

Компьютеры Apple вплоть до Apple II Plus 1979 года не имели командной клавиши. А вся информация ведёт к тому, что Символ ⌘ («квадрат с петлей») был выбран Susan Kare после того, как Стив Джобс решил, что использование логотипа Apple было бы слишком избыточным.

— Все эти факты о том, как был выбран символ для клавиши Command! Пруфы — раз (ссылка на объяснение от самой Сьюзен), два.

@iOS Dev — интересно об обыденном. 👍 — если инфа вас удивила.
Please open Telegram to view this post
VIEW IN TELEGRAM
Memory Warnings при разработке: определение и способы воспроизведения

⚠️ Если системе не хватает свободной памяти и она не может восстановить её, завершив приостановленные приложения, UIKit отправляет предупреждение о нехватке памяти работающим приложениям.

UIKit выдает предупреждения о нехватке памяти следующими способами:

🔘 Вызывая applicationDidReceiveMemoryWarning(_:) в app delegate.

🔘 Вызывая didReceiveMemoryWarning() в каждом из активных UIViewController.

🔘 C помощью didReceiveMemoryWarningNotification во все зарегистрированные observers.

🔘 Каждая из dispatch queues получает warning типа DISPATCH_SOURCE_TYPE_MEMORYPRESSURE.

Когда ваше приложение получает предупреждение о нехватке памяти, освободите как можно больше памяти так быстро, насколько это вообще возможно, с помощью следующих рекомендаций Apple:

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

2️⃣ Удалите ссылки на любые временные объекты, которые вам больше не нужны.

3️⃣ Если активные задачи могут потреблять значительный объем памяти, приостановите dispatch queues или ограничьте количество одновременных операций, выполняемых вашим приложением.

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

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

Что делать в таком случае?

🟢 На симуляторе: откройте Debug -> Simulate Memory Warning (или воспользуйтесь шорткатом CMD+SHIFT+M).

🟢 Приватное API — не используйте его в проде: UIControl().sendAction(Selector(("_performMemoryWarning")), to: UIApplication.shared, for: nil)

ℹ️ А чтобы зафорсить out of memory, есть ещё и такой способ.

@iOS Dev
Пример создания UICollectionViewCompositionalLayout

В iOS 13 Apple представила новый и очень мощный способ создания макетов для UICollectionView — UICollectionViewCompositionalLayout.

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

В композиционном макете используются три типа «строительных блоков»:

🔘 item — описывает свойства фактической ячейки, которые будут отображаться.

🔘 group — это самая мощная вещь в композиционном лэйауте! Больше не нужно вычислять, какой элемент должен быть больше, меньше, полной ширины или половинной ширины. Всю эту информацию достаточно описать в группе.

🔘 section — как следует из названия, описывает секцию. Секция имеет внутри одну группу и может иметь дополнительные элементы, такие как нижние и верхние хэдеры.

📖 В этой статье более детально разбираются определения и приводятся примеры создания.

@iOS Dev
This media is not supported in your browser
VIEW IN TELEGRAM
Архитектура MVVM за 90 секунд

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

Шесть шагов, описанных в материале, затрагивают этапы от создания ViewModel до момента, когда ViewController сможет полагаться на ViewModel для извлечения и форматирования данных.

🛠 Поэкспериментировать самим можно с помощью кода.

📺 В формате короткого 🏴󠁧󠁢󠁥󠁮󠁧󠁿 видео материал доступен здесь.

@iOS Dev
Что такое Measurement type: определение, примеры и способы его использования

Measurement type — невероятно полезный инструмент в наборе инструментов разработчика Apple.

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

📖 В этом материале автор размышляет о причинах для встраивания в свои проекты, в особенности, для разных стран. При этом в статье приводятся способы использования, а также объясняется, как с помощью Measurement преобразовывать разные данные и применять локализацию.

ℹ️ Хотя этот пост посвящен Swift, полезно знать, что в Objective-C можно использовать NSMeasurement, и почти все, упомянутое в этом посте, доступно вам.

К сожалению, Measurement<UnitType>.FormatStyle предназначен только для Swift, и если вы используете Objective-C, придется полагаться на NSMeasurementFormatter для локализации.

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

@iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Senior-разработчик объясняет архитектуру проекта новичкам😎
Please open Telegram to view this post
VIEW IN TELEGRAM
Как работает Bool.random() в Swift на самом деле?

Наверняка, в своих проектах каждый хоть раз использовал нечто вроде:

let randomInt = Int.random(in: 1..<5)
let randomFloat = Float.random(in: 1..<10)
let randomBool = Bool.random()


🤔 Но задумывались ли вы, что происходит на самом деле внутри? Иногда я смотрю на реализацию крутых вещей в ядре Swift, как например в посте про сортировку, и ищу материалы, объясняющие то или иное решение.

Так вот, в случае Bool полная реализация API будет получать необработанное значение UInt64 от генератора (он же RNG), сдвигать его вправо 17 раз и возвращать true, если первый бит результирующего значения равен 0.

Самое интересное в количестве, а именно, почему же 17?

Причина, по которой значение сдвигается ровно 17 раз, заключается в том, что (некоторые) слабые ГСЧ (генераторы случайных чисел) имеют лучшие свойства случайности в средних битах по сравнению с младшими/старшими битами.

Команда разработчиков Swift решила защитить нас от API, которые решили использовать эти ГСЧ вместо стандартного SystemRandomNumberGenerator.

ℹ️ Кстати, до пулл-реквеста, в котором реализовано это улучшение, Bool.random() просто возвращал generator.next() % 2 == 0.

📖 Почитать подробнее можно в ядре свифта или в более понятном источнике. А ещё рекомендую пост про UUID.

@iOS Dev
Как реализовать обновления в реальном времени с помощью Live Activity + Бонус

ℹ️ Live Activities будут представлены в iOS 16.1 как способ отображения актуальной информации на экране блокировки iPhone и в Dynamic Island.

📖 В этой статье автор разбирается с API с помощью создания приложения доставки, где пользователь будет получать обновления своего заказа прямо на экран блокировки своего телефона.

👩‍💻 Бонусом идёт модифицированный скрипт для отправки нужных пушей, взятый из документации Apple.

👨‍💻 Кроме этого материала, советую ознакомиться с официальной документацией, если вы планируете внедрять эту функциональность в свои приложения.

@iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
Создание и планирование локальных уведомлений с помощью async/await

После того как вы получите разрешение на отправку уведомлений, вам будет доступно управление уведомлениями с помощью user notification center.

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

@iOS Dev
Интерполяция строк в Swift 5

📖 Swift 5 добавил некоторые приятные улучшения для интерполяции строк, о которых многие люди могут не знать.

Как минимум, это возможность управлять интерполяцией в кастомный тип, использующий ExpressibleByStringInterpolation.

ℹ️ Это позволит создавать такие типы, как HTML, и управлять новым форматированием строк OSLog (например, log.debug("value \(x, privacy: .public)").

Бекка Ройал-Гордон предоставила несколько хороших примеров этого в SE-0228.

Как побочный эффект, String и Substring теперь используют DefaultStringInterpolation, что дает нам возможность для настройки поведения интерполяции.

@iOS Dev
Как подружить фичу Autoplay и tvOS?

Autoplay — это когда по завершении просмотра одного фильма пользователю предлагается посмотреть похожий контент, рекомендованный системой.

О нюансах реализации этой фичи на tvOS рассказала Валерия Рублевская, iOS-разработчик на проекте онлайн-кинотеатра KION от МТС.

Прочитать можно здесь.
Использование Apple Swift и SwiftUI в iOS 16

📖 Большое исследование от Alexandre Colucci, которое стало уже традиционным. Как и в прошлые годы, автор постарался ответить на следующие вопросы:

🔘 Сколько бинарников в iOS 16?
🔘 Какие языки программирования используются для разработки этих приложений?
🔘 Сколько приложений написано на Swift?
🔘 Каков процент приложений, использующих SwiftUI, по сравнению с UIKit?

В материале автор рассказывает о методологии, об эволюции языков программирования и сравнивает UIKit со SwiftUI непосредственно в самих приложениях Apple.

Всё это с помощью красивых графиков, а для любителей статистики — приводится массив данных по каждой из iOS.

Краткий вывод

Swift продолжает свое экспоненциальное восхождение и в этом году он опередил C++. Кроме этого, SwiftUI чаще задействуется и в Apple: количество двоичных файлов, использующих SwiftUI, удвоилось между iOS 15 и iOS 16.

@iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Вы только посмотрите, разве это не самая милая реализация возможностей Dynamic Island?

В приложении Apollo можно кормить питомцев, играть с ними в игры, укреплять дружбу и не только.

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

@iOS Dev
Учебник по кривым Безье — бесплатный ресурс (а по факту книга на github) с огромным руководством по работе с кривыми Безье

📖 Это электронная книга, посвященная как математическим, так и программным аспектам кривых Безье, охватывающая широкий круг тем, связанных с рисованием и работой с этой кривой, которая, кажется, появляется повсюду, от путей Photoshop до функций смягчения CSS и контура шрифта.

🕔 Я, конечно, ни на что не намекаю, но материал может пригодиться и когда-нибудь в будущем.

📖 В этом материале рассматриваются 45 глав, которые охватывают если не всё, то почти всё, связанное с этой темой.

Поэтому, если вас не пугает большое количество формул и расчётов, то источник вполне можно сохранить себе.

P.S. От себя бы добавил желающим поучаствовать два совета, которыми вы легко можете пренебречь:

1️⃣ Отталкивайтесь в любом конкурсе от базы, а именно, от минимальных требований.

2️⃣ Планируйте своё время. Не только в конкурсе, а и в рабочих задачах. И помните про декомпозицию.

Не факт, что я сам буду участвовать в этот раз, но всем, кто попробует свои силы — ⭐️ удачи!

@iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Код Воробья для iOS разработчиков
В Xcode 14 добавили экспорт локализации пакетов. Подробнее в туториале по локализации.

Это новый туториал на сайте, мы сделали большой ультимативный гайд по локализации. Разобрали основы, экспорт и импорт, как локализовать SPM-пакеты, плюрализацию, картинки, плагины для авторгенерации.

В конце туториала узнаете почему для некоторых российский рубль показывается как , а для некоторых RUB.
Vision Framework для iOS: обнаружение контуров

💡 Творческий подход к доступным вам инструментам может существенно повлиять на результат.

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

Вы даже можете использовать алгоритмы компьютерного зрения для создания интересных фильтров и эффектов для изображений и фотографий.

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

📖 В этом руководстве вы узнаете, как использовать фреймворк Vision для следующих этапов:

1️⃣ Создание запросов для обнаружения контуров.

2️⃣ Настройка параметров для получения разных контуров.

3️⃣ Упрощение контуров для создания художественных эффектов.

@iOS Dev
OptionSet в Swift: определение, примеры и при чём тут побитовые операторы?

Недавно я писал пост про «базу» и то, что на самом деле мы гораздо чаще, чем нам кажется, встречаемся с важными алгоритмическими понятиями.

📖 В этом материале рассказывается о том, что создать собственный OptionSet не так уж и сложно.

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

Хотя вы можете инициализировать его литералом массива, на самом деле он больше похож на Set, чем на массив.

ℹ️ Фактически, OptionSet наследует все SetAlgebra, которые вы можете применять к сетам, что означает, что OptionSet имеет такие методы, как intersection, union, contains и несколько других методов, которые вы могли использовать в Set.

В статье рассказывается об этой и остальных особенностях, приводится пример создания и рассматриваются возможности работы с OptionSet.

@iOS Dev
Простой доступ к данным симулятора

🔎 При разработке для iOS часто бывает полезно перейти к файлам, которые вы создаете в симуляторе.

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

Трудности с поиском файлов становятся еще более очевидными при работе в команде.

ℹ️ В этом решении идея состоит в том, чтобы проверить таргет, а затем добавить символическую ссылку на ваш рабочий стол.

Проверка переменных среды, доступных при работе в симуляторе, показывает, что есть вся необходимая информация, чтобы это произошло.

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

@iOS Dev
UIStackView: Distribution и Alignment

Несмотря на то, что UIStackView значительно упрощает лэйаут, он все равно может стать довольно сложным и несколько запутанным.

Существует четыре основных свойства UIStackView:

1️⃣ axis

2️⃣ distribution

3️⃣ alignment

4️⃣ spacing

Первый и последний относительно просты. Мы используем axis, чтобы определить ориентацию представления стека, которая может быть вертикальной или горизонтальной.

Как насчет оставшихся двух: alignment и spacing?

Хотя UIStackView стал настолько популярным и широко используется во многих приложениях, многие могут не понимать его полностью и использовать неправильно.

📖 И как раз о причинах сложностей и свойствах UIStackView рассказывается в этом материале.

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