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

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

#ios #mobile #swift
Download Telegram
Паттерн «Навигатор»: изучаем и осваиваем NavigationStack в SwiftUI 👨‍💻

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

🧭 Навигация была главной больной точкой фреймворка с самого первого дня. К счастью, после #WWDC22 ситуация изменилась, и SwiftUI теперь предоставляет новый API навигации на основе данных.

📖 В этом материале можно узнать, как использовать новый Navigation API для построения
user flow — пути, которым могут воспользоваться пользователи внутри приложения.

@iOS Dev
Как сбросить UserDefaults в Swift?

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

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

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

🛠 Но что делать, если таких ключей у нас пара десятков? Тогда на помощь придёт системное API, в котором пригодится removePersistantDomainForName.

@iOS Dev
Grand Central Dispatch: многопоточность, очереди, параллелизм

Grand Central Dispatch (GCD) - это низкоуровневый API для управления параллельными операциями. Он может помочь улучшить скорость отклика вашего приложения, откладывая вычислительно дорогие задачи на задний план. Это более простая в работе модель, нежели блокировки и потоки.

📖 В этом материале по Grand Central Dispatch, состоящем из двух частей, вы узнаете все тонкости GCD и его Swifty API.

В первой части объясняется, что делает GCD, и демонстрируется несколько основных функций GCD.

Во второй части вы узнаете о некоторых расширенных функциях GCD.

Вы будете работать над существующим приложением под названием GooglyPuff. GooglyPuff - это неоптимизированное, "потокобезопасное" приложение, которое накладывает «гугл-глаза» на обнаруженные лица, используя API Core Image для обнаружения лиц.

🛠 В рамках этих статей GCD поможет оптимизировать приложение и обеспечить безопасный вызов кода из разных потоков.

@iOS Dev
This media is not supported in your browser
VIEW IN TELEGRAM
Создание кастомного ParseableFormatStyle в iOS

Начиная с iOS 2.0, старый класс Formatter и его производные, такие как DateFormatter и NumberFormatter, были основным средством преобразования значений в строки и наоборот — из строк. С течением времени Apple добавила другие крутые форматеры, такие как ByteCountFormatter, MeasurementFormatter, RelativeDateTimeFormatter и ListFormatter.

📖 В этом посте рассматриваются развёрнутые возможности и приводятся примеры, как расширить ParseableFormatStyle и связанные с ним протоколы, чтобы создать собственный пользовательский форматер телефонных номеров. Затем его используют для фактического форматирования ввода текстовых полей.

🙌 И хотя в статье автор пишет про iOS, эти протоколы доступны в macOS, watchOS и tvOS.

@iOS Dev
DoNilDisturb Swift Plugin

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

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

Не у всех выходные в субботу и воскресенье, и не у всех рабочий день длится с 9 до 17 часов, но всё-таки!

Опенсорсный DoNilDisturb Swift Plugin (nil, ахахах, ну вы поняли) делает именно это — не даёт вам запустить ваш проект в нерабочее время.

Хороших вам выходных, iOS-разработчики❤️!

@iOS Dev
iOS Responder Chain: UIResponder, UIEvent, UIControl и их использование

🤔 Что вообще за зверь такой, responder, если я имею дело с UITextFields?
🤔 Почему UIViews юзает сабкласс от UIResponder?
🤔 Вообще, в чем их смысл?

В iOS Responder Chain — это название, данное сгенерированному UIKit связному списку объектов UIResponder, и это основа для всего, что касается событий (touch, motion).

🛠 Responder Chain — это то, с чем мы постоянно встречаемся при разработке, и хотя не так часто приходится иметь с ней дело напрямую, пожалуй, кроме манипуляций с клавиатурой UITextField 😉, знание того, как она работает, позволяет решать связанные с событиями проблемы простыми/креативными способами.

Экземпляры UIResponder это объекты, которые могут обрабатывать и реагировать на произвольные события. Многие вещи в iOS являются UIResponder, включая UIView, UIViewController, UIWindow, UIApplication и UIApplicationDelegate.

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

@iOS Dev
Быстрый способ проверить, все ли элементы коллекции удовлетворяют заданному условию

👌 Со Swift 4.2 для этого можно использовать метод allSatisfy().

🟢 Если все элементы удовлетворяют заданному условию, то вызов allSatisfy() вернет true.

🔴Если хотя бы один элемент не пройдет наше условие, то результатом вызова allSatisfy() будет false.

@iOS Dev
This media is not supported in your browser
VIEW IN TELEGRAM
Быстрый способ проверить созданную URL-схему (диплинк) в симуляторе c помощью терминала

Есть старый способ с использованием Safari, но он не так эффективен. Safari не запоминает последнюю добавленную схему, поэтому вам придется вводить её снова и снова. А переход между браузером и приложением делает ситуацию хуже, ещё и тратит время.

👌 Расскажу о другом способе. Вы наверняка знаете, что есть xcrun, который можно использовать для запуска любого инструмента внутри Xcode из командной строки. Опцией для способа ниже является simctl, который и поможет вам управлять симуляторами.

Для этого можно использовать:

xcrun simctl openurl booted <url>

💻 В качестве параметра url нужно использовать вашу ранее созданную схему. В моём примере это: exampleapp://test.

Специально для @iOS Dev.
10 фактов про разработку первых айфонов от Кена Косиенды — сотрудника Apple с 15-летним опытом и изобретателя автозамены в iPhone

Разработка это не только написание кода, но и различные подходы к алгоритмам и решению тех или иных задач.

Иногда я встречаю интересные факты или алгоритмы, но ещё более важно — истории программистов, особенно тех, кто стоял у истоков. Сегодня я собрал для вас подборку из фактов от программиста Apple, с работой которого каждый из нас сталкивается чаще, чем может показаться.

@iOS Dev
Equality в Swift: протокол Equatable, объяснение и примеры

🧐 Проверка того, считаются ли два объекта или значения равными, определенно является одной из наиболее часто выполняемых операций во всем программировании.

💻 Одним из наиболее интересных аспектов реализации равенства в Swift является то, что все это сделано протокольно-ориентированным способом — это означает, что любой тип может стать равнозначным, соответствуя протоколу Equatable.

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

@iOS Dev
This media is not supported in your browser
VIEW IN TELEGRAM
Продвинутые анимации в SwiftUI

📖 В цикле статей авторы погружаются в некоторые продвинутые техники создания анимации SwiftUI. Подробно рассказывается о протоколе Animatable, его верном спутнике animatableData, мощном и часто игнорируемом GeometryEffect и протоколе AnimatableModifier.

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

1️⃣ Часть первая — Paths.

2️⃣ Часть вторая — GeometryEffect.

3️⃣ Часть третья — AnimatableModifier.

🛠 Все статьи насыщены примерами, а исходный код можно найти на гитхабе.

@iOS Dev
Стратегии обращения к пользователям с просьбой оценить ваше приложение 👏

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

Что НЕ следует делать
🔴 Показывать алерт при запуске.
🔴 Показывать его слишком рано.
🔴 Показывать при любом общем для всех действии.

Стратегии получения максимальной отдачи
🟢 Ориентироваться на уникальное действие в приложении.
🟢 Совмещать оценку с существующими. Например, если пользователь уже что-то положительно оценил в вашем приложении.
🟢 Внедрите систему, основанную на весе, для управления отображением ваших алертов. Например:

— Открытие твита 1 балл.
— Лайк твита 3 балла.
— Создание твита 5 баллов.

Если пользователь достигнет нужного порога — показываем запрос.
🙋Но вы должны использовать этот инструмент очень эффективно, потому что он очень ограничен, и если вы не будете осторожны, это может привести к печальному результату.

@iOS Dev
На StackOverflow выпустили большой, вернее, ОГРОМНЫЙ отчёт по результатам опроса более 70 000 разработчиков.

Собрал в один пост выжимку по фактам для Swift и Objective-C, больше графиков и сравнений можно посмотреть здесь.

Для Swift

❤️ 63% любят этот язык,😱 37% считают его неприятным.
💵 Медианная зарплата составляет $ 78 468 в год.

Для Objective-C

❤️ 24% любят, 😱 76% считают его неприятным.
💵 Медианная зарплата $ 83 165 в год.

Может на нём не так приятно писать, но пять тысяч долларов это пять тысяч долларов.

Удовлетворённость средой разработки Xcode равная, 50% считают его годным инструментом, а 50% не очень.

Лидеры по зарплатам Closure и Erlang — разработчикам, пишущим на одном из этих языков, платят в среднем $ 100 000 в год.

@iOS Dev
Применение default для подсчёта количества символов в строке

Задача подсчёта символов в строках является одним из потенциальных вопросов во многих алгоритмических секциях.

Вы можете легко установить значение по умолчанию для ключа в словаре. Для этого как раз можно воспользоваться ключевым словом default.

🛠 На скриншоте я показал два способа для подсчёта повторений букв в строке «Hello iOS Devs».

💼 Конечно, вариантов подсчёта может быть намного больше, но всегда полезно расширить свой инструментарий.

@iOS Dev
Xcode's Energy Organizer: поиск причин крашей при высокой нагрузке на CPU

Если вы не знаете, что такое CPU Usage termination, вам повезло. Это не только один из самых неприятных крашей в iOS, но он даже не рассматривается системой как сбой.
Об этом не сообщается Firebase, поэтому о сбое вы даже не узнаете. Ну, пока ваши пользователи не начнут сообщать вам об этом. Очень неприятная вещь!

🤔 Что такое CPU Exceptions в iOS?

Согласно Apple, ваше приложение может грузить процессор — до тех пор, пока оно в foreground и не делает это долго.
Однако в фоне вам необходимо сократить использование процессора. Это не то чтобы большая проблема, если задача выполняется единожды.
Но если вы постоянно используете более 80% процессора в течение одной минуты, iOS без предупреждения закроет приложение.

Это называется CPU Exception, или "прекращение работы при высокой нагрузке на процессор".

📖 В статье разбирается это понятие, рассматривается Xcode's Energy Organizer и приводится совет для предотвращения.

@iOS Dev
Простой способ подсчитать количество строк в ваших Swift-файлах

Для этого вам понадобится терминал. Нужно перейти в корень вашего проекта и скопировать эту команду (для чистоты эксперимента тут исключено содержимое зависимостей CocoaPods):

find . -path ./Pods -prune -o -name '*.swift' -print0 ! -name '/Pods' | xargs -0 wc -l

Это не всё! Если вы хотите большего, то с помощью этой утилиты можно по фану определить стоимость кода в проекте💰.

@iOS Dev
This media is not supported in your browser
VIEW IN TELEGRAM
Субботний опенсорс

🛠 Полезный репозиторий с реализацией нескольких сортировок.

Бонусом идёт наглядная демонстрация процесса (в примере для этого показано отображение для Quick Sort).

Используется Swift Playgrounds.

@iOS Dev

#opensource
Различные способы перехвата ошибок в Swift при использовании do-catch

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

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

📖 В этой статье автор рассматривает различные способы перехвата из throw-функций. Кроме этого, описываются типы этих функций и разбирается, что в них используется для разделения каждого catch.

@iOS Dev
Clean Architecture и MVVM в iOS: пример реализации проекта

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

Как мы видим на графике Clean Architecture, у нас есть различные слои в приложении. Главное правило — не иметь зависимостей от внутренних слоев к внешним. Стрелки, указывающие снаружи внутрь, это правило зависимостей. Зависимости могут быть только от внешнего слоя внутрь.

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

🛠 Проект на Github, который может быть использован в качестве шаблона.

@iOS Dev
This media is not supported in your browser
VIEW IN TELEGRAM
Когда скопировал два решения со StackOverflow

На самом деле это решение от изобретателя с ником The Q (подозреваю, тут есть связь с Джеймсом Бондом).

По легенде, автор сломал колесо своего обычного байка. А после этого решил не выбрасывать его и распилил на две равные половины, после чего и собрал новую версию транспорта — «по формуле 1+0,5+0,5=2».

😅 Иногда хочется поделиться не только серьёзными вещами.

@iOS Dev
PhotosPicker: инструмент выбора фотографий с помощью SwiftUI и Transferable

📖 В этой статье рассказывается, как использовать новый SwiftUI PhotosPicker API, о котором было объявлено на одной из сессий #WWDC.

Новый SwiftUI PhotosPicker API доступен на всех платформах:

iOS (16.0+)
iPadOS (16.0+)
macOS (13.0+)
watchOS (9.0+)

Больше не нужно использовать UIViewControllerRepresentable для обертывания PHPickerViewController или его старой версии UIImagePickerController.

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

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

Для внедрения нужны два шага:

1️⃣ Использовать PhotosPicker для получения одного или нескольких экземпляров PhotosPickerItem.
2️⃣ Загрузить данные об объекте с помощью PhotosPickerItem.loadTransferable.

@iOS Dev