iOS Dev
رفتن به کانال در Telegram
👨💻Автор: Виктор Грушевский (@Viktorianec) ⚒️ База: https://boosty.to/ios_dev | 🤖 @iOSIQBot | https://iosiq.ru 🍏Канал об iOS-разработке, алгоритмах и архитектурах ⭐️ Подготовка к собесам ⭐️ Код. Много кода. #ios #mobile #swift
نمایش بیشتر7 999
مشترکین
-124 ساعت
+457 روز
+7630 روز
آرشیو پست ها
7 998
Продвинутые анимации в SwiftUI
📖 В цикле статей авторы погружаются в некоторые продвинутые техники создания анимации SwiftUI. Подробно рассказывается о протоколе
Animatable, его верном спутнике animatableData, мощном и часто игнорируемом GeometryEffect и протоколе AnimatableModifier.
Все эти темы не слишком хорошо описаны в официальной документации и не очень часто упоминаются в постах и статьях о SwiftUI.
Тем не менее, они предоставляют нам инструменты для создания довольно красивых анимаций.
1️⃣ Часть первая — Paths.
2️⃣ Часть вторая — GeometryEffect.
3️⃣ Часть третья — AnimatableModifier.
🛠 Все статьи насыщены примерами, а исходный код можно найти на гитхабе.7 998
Equality в Swift: протокол Equatable, объяснение и примеры
🧐 Проверка того, считаются ли два объекта или значения равными, определенно является одной из наиболее часто выполняемых операций во всем программировании.
💻 Одним из наиболее интересных аспектов реализации равенства в Swift является то, что все это сделано протокольно-ориентированным способом — это означает, что любой тип может стать равнозначным, соответствуя протоколу
Equatable.
📖 Например, в этой статье рассматривается, как Swift моделирует концепцию равенства и как эта модель различается между типами значений и ссылок.7 998
10 фактов про разработку первых айфонов от Кена Косиенды — сотрудника Apple с 15-летним опытом и изобретателя автозамены в iPhone
⚪ Однобуквенные и двухбуквенные комбинации были просто хардкодом. Тяжело поверить, но это правда. При вводе «ik» всегда была автокоррекция на «ok».
⚪ Автокоррекция на оригинальном iPhone была очень простой. Оно всегда соответствовала количеству набранных вами букв — автодополнения не было. Если вы введете 5 букв, в качестве исправлений будут предлагаться только слова из 5 букв… Кроме сокращений, код алгоритма также мог добавлять апостроф.
⚪ Как только вы набирали третью букву в слове, алгоритм просматривал места ваших касаний и строил путь, который больше всего был похож на созвездие, и пытался сопоставить этот шаблон с идеальным центральным попаданием по клавишам для всех слов в словаре.
Ближайшее совпадение побеждало. Если это слово отличалось от того, что вы напечатали, а самого слова не было в словаре иначе или оно было настолько непопулярным в языке, чем совпадающее слово, автоисправление предлагало изменение.
С точки зрения памяти и вычислений, это было почти все, что команда могла себе позволить на оборудовании в то время. Алгоритм просто делал свою работу.
⚪ У Кена появилась идея сопоставить тип клавиатуры с каждым текстовым полем — например, при нажатии на поле с номером телефона будет отображаться цифровая клавиатура. А ещё временные названия вроде: text input traits, return key type и другие.
Примечание: ну, как временное 😂
⚪ На оригинальной клавиатуре iPhone нужна была клавиша удаления в правом верхнем углу (как на более привычных десктопных клавиатурах). Но она просто-напросто не помещалась, поэтому Кен переместил её на третий ряд, где было место. Кроме того, третий ряд клавиш не смещен относительно второго ряда. Сейчас же нам кажется, что так и нужно👏.
⚪ Кен реализовал словарь автозамены iPhone. Он начал со старых списков слов, которые Apple хранила на редко посещаемых внутренних сайтах. Затем были добавлены всевозможные «дополнения». Названия продуктов (с заглавными буквами: iMac). Названия спортивных команд, затем сленговые сокращения (с Dont -> Don’t). И так далее.
⚪ При разработке команда поняла, что система автозамены может предлагать запрещённые (матерные) слова, поэтому был добавлен список таких выражений с установленным битом для тех записей, которые гласили: «никогда не выполнять автозамену этих слов». Вы могли напечатать их точно, но вот клавиатура в этом бы не помогла.
⚪ В оригинальном iPhone не было cut/copy/paste. Печально известный факт имеет простое объяснение. У Кена не было времени сделать это правильно: он объясняет это тем, что было слишком много работы с клавиатурой, автоисправлением и текстовой системой в целом. У команды дизайнеров тоже не было времени. Так оно и ушло в прод.
⚪ Кривизна пальцев заставляет вас думать, что вы касаетесь экрана выше, чем на самом деле. Поэтому прикосновения определяются с учетом этого. Вот почему даже сегодня трудно определить точку касания, если держать телефон вверх ногами.
⚪ Оригинальный iPhone не имел виртуальной памяти. Некоторые люди придумали систему под названием «Jetsam». Поскольку показывалось только одно приложение за раз, сначала завершали фоновые программы, когда не хватало памяти. Эти программы перезапускались, а не возобновлялись при возвращении на передний план.
Не могу не поделиться найденным комментарием на эту тему:
И вся нужная структура была разработана позже, чтобы автоматически сохранять и восстанавливать состояние приложения, создавая иллюзию того, что приложение работало все время.
Фух! Вот такое небольшое путешествие во времени. Если вы хотите больше необычных фактов, то они есть в книге «Creative Selection: Inside Apple's Design Process During the Golden Age of Steve Jobs». И, конечно, в нашем канале:
@iOS Dev
7 998
10 фактов про разработку первых айфонов от Кена Косиенды — сотрудника Apple с 15-летним опытом и изобретателя автозамены в iPhone
Разработка это не только написание кода, но и различные подходы к алгоритмам и решению тех или иных задач.
Иногда я встречаю интересные факты или алгоритмы, но ещё более важно — истории программистов, особенно тех, кто стоял у истоков. Сегодня я собрал для вас подборку из фактов от программиста Apple, с работой которого каждый из нас сталкивается чаще, чем может показаться.
Продолжение тут: 👇
7 998
10 фактов про разработку первых айфонов от Кена Косиенды — сотрудника Apple с 15-летним опытом и изобретателя автозамены в iPhone
Разработка это не только написание кода, но и различные подходы к алгоритмам и решению тех или иных задач.
Иногда я встречаю интересные факты или алгоритмы, но ещё более важно — истории программистов, особенно тех, кто стоял у истоков. Сегодня я собрал для вас подборку из фактов от программиста Apple, с работой которого каждый из нас сталкивается чаще, чем может показаться.
Продолжение тут: 👇
7 998
Быстрый способ проверить созданную URL-схему (диплинк) в симуляторе c помощью терминала
⏳ Есть старый способ с использованием Safari, но он не так эффективен. Safari не запоминает последнюю добавленную схему, поэтому вам придется вводить её снова и снова. А переход между браузером и приложением делает ситуацию хуже, ещё и тратит время.
👌 Расскажу о другом способе. Вы наверняка знаете, что есть xcrun, который можно использовать для запуска любого инструмента внутри Xcode из командной строки. Опцией для способа ниже является simctl, который и поможет вам управлять симуляторами.
Для этого можно использовать:
xcrun simctl openurl booted <url>
💻 В качестве параметра url нужно использовать вашу ранее созданную схему. В моём примере это: exampleapp://test.
Специально для @iOS Dev.7 998
Быстрый способ проверить, все ли элементы коллекции удовлетворяют заданному условию
👌 Со Swift 4.2 для этого можно использовать метод
allSatisfy().
🟢 Если все элементы удовлетворяют заданному условию, то вызов allSatisfy() вернет true.
🔴Если хотя бы один элемент не пройдет наше условие, то результатом вызова allSatisfy() будет false.7 998
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.
📖 В этом материале рассказывается про это детальнее, и приводятся примеры использования.7 998
DoNilDisturb Swift Plugin
😎 Важно не терять фокус во время выполнения задач, но знаете, иногда всем нам нужен отдых (особенно ближе к вечеру пятницы).
Решил поделиться с вами шуточным плагином, который не позволит вам билдить проекты в нерабочее время😂
Не у всех выходные в субботу и воскресенье, и не у всех рабочий день длится с 9 до 17 часов, но всё-таки!
Опенсорсный DoNilDisturb Swift Plugin (nil, ахахах, ну вы поняли) делает именно это — не даёт вам запустить ваш проект в нерабочее время.
Хороших вам выходных, iOS-разработчики❤️!
7 998
Создание кастомного ParseableFormatStyle в iOS
⏳ Начиная с iOS 2.0, старый класс
Formatter и его производные, такие как DateFormatter и NumberFormatter, были основным средством преобразования значений в строки и наоборот — из строк. С течением времени Apple добавила другие крутые форматеры, такие как ByteCountFormatter, MeasurementFormatter, RelativeDateTimeFormatter и ListFormatter.
📖 В этом посте рассматриваются развёрнутые возможности и приводятся примеры, как расширить ParseableFormatStyle и связанные с ним протоколы, чтобы создать собственный пользовательский форматер телефонных номеров. Затем его используют для фактического форматирования ввода текстовых полей.
🙌 И хотя в статье автор пишет про iOS, эти протоколы доступны в macOS, watchOS и tvOS.7 998
Grand Central Dispatch: многопоточность, очереди, параллелизм
Grand Central Dispatch (GCD) - это низкоуровневый API для управления параллельными операциями. Он может помочь улучшить скорость отклика вашего приложения, откладывая вычислительно дорогие задачи на задний план. Это более простая в работе модель, нежели блокировки и потоки.
📖 В этом материале по Grand Central Dispatch, состоящем из двух частей, вы узнаете все тонкости GCD и его Swifty API.
⚫ В первой части объясняется, что делает GCD, и демонстрируется несколько основных функций GCD.
⚫ Во второй части вы узнаете о некоторых расширенных функциях GCD.
Вы будете работать над существующим приложением под названием GooglyPuff. GooglyPuff - это неоптимизированное, "потокобезопасное" приложение, которое накладывает «гугл-глаза» на обнаруженные лица, используя API Core Image для обнаружения лиц.
🛠 В рамках этих статей GCD поможет оптимизировать приложение и обеспечить безопасный вызов кода из разных потоков.
7 998
Как сбросить UserDefaults в Swift?
👌 Мы можем использовать UserDefaults в наших приложениях для хранения некоторых базовых конфигураций или настроек приложения.
Вот только по мере усложнения проекта иногда нам может понадобится функция очистки всего конфига.
🤔 Мы можем использовать метод
removeObject, чтобы удалить значение для определенного ключа (и сделать так для каждого).
🛠 Но что делать, если таких ключей у нас пара десятков? Тогда на помощь придёт системное API, в котором пригодится removePersistantDomainForName.7 998
Паттерн «Навигатор»: изучаем и осваиваем NavigationStack в SwiftUI 👨💻
SwiftUI — это декларативный фреймворк, позволяющий нам создавать сложные пользовательские интерфейсы, определяя данные, отображаемые на экране.
🧭 Навигация была главной больной точкой фреймворка с самого первого дня. К счастью, после #WWDC22 ситуация изменилась, и SwiftUI теперь предоставляет новый API навигации на основе данных.
📖 В этом материале можно узнать, как использовать новый Navigation API для построения
user flow — пути, которым могут воспользоваться пользователи внутри приложения.
7 998
WWDC: Вопросы и ответы
из Digital Lounges
В некоторых источниках уже фигурировали ответы по SwiftUI, собранные из каналов Slack по итогам общения разработчиков с работниками Apple.
📖 Пользователь твиттера по имени Emin пошёл дальше и создал ресурс со всеми темам из Digital Lounges.
👏 Из плюсов — хороший поиск и степень структурирования, а также потенциальное масштабирование.
🛠 Также вы можете внести и свой вклад в опенсорсный проект на гитхабе.
7 998
Улучшение работы с closures в Swift 5.7
⏳ Раньше Swift действительно боролся с любыми замыканиями, которые не были тривиальными, но начиная с Swift 5.7 мы теперь можем писать код, как в первом примере.
😎 В новой версии было принято предложение SE-0326. Это сделало вывод типов менее неожиданным для разработчиков и устранило существующую ошибку в поведении.
👌 Речь здесь идёт о том, что добавление еще одного выражения или оператора в closure могло приводить к ошибке компиляции. Теперь такого не будет, и это хорошо.
7 998
Различные методы удаления последнего элемента из массива в Swift
1️⃣ dropLast()
let fruits = ["Apple","Orange","Banana"]
let nonRoundFruits = fruits.dropLast()
print(nonRoundFruits) // ["Apple", "Orange"]
Использование метода dropLast() удалит последний элемент и вернет оставшиеся. dropLast() является предпочтительным методом удаления массива, поскольку он безопасен, так как не изменяет исходный массив.
2️⃣ removeLast()
var fruits = ["Apple","Orange","Banana"]
let removedFruit = fruits.removeLast()
print(fruits) // ["Apple", "Orange"]
print(removedFruit) // Banana
В отличие от метода dropLast(), метод removeLast() удаляет последний элемент из исходного массива и модифицирует его.
3️⃣ popLast()
var fruits = ["Apple","Orange","Banana"]
let removedFruit = fruits.popLast()
print(fruits) // ["Apple", "Orange"]
print(removedFruit) // Optional("Banana")
🧐 Метод popLast() похож на прошлый, но есть разница. Если в массиве нет элементов перед вызовом popLast(), краша не будет. Вместо этого вернётся nil.7 998
Реализация собственного собственного календаря с использованием UICalendarView на Swift в iOS 16
👏 Написал небольшую статью про то, как быстро можно внедрить новый UICalendarView в ваше приложение на Swift, в котором будет новая ось.
😉 Пример кода тоже есть, иначе зачем это всё.
7 998
Xcode 14 научили сохранять значение параметра при автокомплите вместо добавления нового
🎉 Одна из самых неприятных вещей в среде разработки была побеждена. Если раньше при автокомплите сохранялся старый код с уже заданным параметром и добавлялся новый слева, то теперь в Apple это оптимизировали и сэкономили всем нам немного нервов при разработке.
Надеюсь, что инициаторы этой фичи в Xcode получили свою заслуженную премию 😉.
7 998
Пример создания CircleLayout в SwiftUI
❗️Внимание! Эта возможность официально не документирована (или спрятана, как другие Private API) и пока непонятно, как будут относиться в Apple на ревью. Я не рекомендую использовать это в ваших проектах на данный момент.
😎 Оказывается, что кроме стандартных типов лэйаута есть
CircleLayout, который может привести к такому необычному отображению.
Если кто-то из вас, коллеги, делал приложения для WatchOS, то возможно вы проходили через некоторые сложности анимаций. Мне этот CircleLayout напомнил анимацию для часов, страшно даже сказать вслух, с #WWDC 2015.
⏳ Верю, что этот тип layout рано или поздно всё-таки анонсируют, так как, например, для часов мы уже видели улучшения.7 998
Как использовать Live Text API в вашем приложении для iOS
С iOS 16 функция Live Text стала доступна для разработчиков. Однако в Xcode 14 вы не найдете ни LiveTextKit, ни фреймворка с подобным названием. Всё дело в том, что новые API являются частью фреймворка VisionKit.
ℹ️ И вообще, Live Text — это скорее маркетинговый термин. Классы, которые нужно использовать, это
ImageAnalyzer и ImageAnalysisInteraction.
Базовая настройка по на деле не очень сложная. Нам нужен UIImageView для отображения overlay и экземпляр UIImage с каким-нибудь изображением, содержащим либо текст, либо, например QR-код.
📖 В своей статье Filip Němeček приводит пример работы этих API.
📼 Перед этим можно посмотреть видео с #WWDC или почитать документацию.
اکنون در دسترس! پژوهش تلگرام ۲۰۲۵ — مهمترین بینشهای سال 
