Почему использование isEmpty быстрее, чем проверка count == 0?
Чтобы понять, почему
Строки Swift представляют собой сложные наборы символов, в которых несколько символов могут объединяться вместе, образуя одну букву, видимую пользователям.
Например, такой простой смайлик, как британский флаг 🇬🇧, на самом деле состоит из двух разных символов: «G» и «B».
Символы
На самом деле в Swift большая часть сложности спрятана внутри, например, один символ, видимый пользователям, может быть дюжиной базовых значений в самой строке.
Таким образом, когда мы читаем размер строки с помощью count, Swift должен пройти через все символы, чтобы выяснить настоящую длину строки.
📖 В этом материале приводится детальное объяснение смелого заявления на примерах.
@iOS Dev
Чтобы понять, почему
isEmpty
быстрее, чем count == 0
для строк, нам нужно углубиться в то, как строки работают в Swift на самом деле. Строки Swift представляют собой сложные наборы символов, в которых несколько символов могут объединяться вместе, образуя одну букву, видимую пользователям.
Например, такой простой смайлик, как британский флаг 🇬🇧, на самом деле состоит из двух разных символов: «G» и «B».
Символы
Unicode
, если их поставить рядом, автоматически станут британским флагом.На самом деле в Swift большая часть сложности спрятана внутри, например, один символ, видимый пользователям, может быть дюжиной базовых значений в самой строке.
Таким образом, когда мы читаем размер строки с помощью count, Swift должен пройти через все символы, чтобы выяснить настоящую длину строки.
📖 В этом материале приводится детальное объяснение смелого заявления на примерах.
@iOS Dev
This media is not supported in your browser
VIEW IN TELEGRAM
Кастомные анимации переходов между UIViewController с использованием Metal
Довольно часто многие боятся использовать новые API из-за недостатка знаний о том, что может предоставить инструмент, а также из-за отсутствия информации, доступной в Интернете для изучения (иногда это ограничивается скудной документацией Apple).
📖 В этом материале можно узнать, как использовать Metal в приложении, создавая собственные переходы (и анимации).
Ricardo Rachaus рассказывает о своем опыте работы с
🛠 А вот в этом репозитории можно посмотреть код и попробовать создать собственную анимацию.
@iOS Dev
Metal
— это низкоуровневый API для программирования GPGPU (General Purpose Graphics Processing Unit).Довольно часто многие боятся использовать новые API из-за недостатка знаний о том, что может предоставить инструмент, а также из-за отсутствия информации, доступной в Интернете для изучения (иногда это ограничивается скудной документацией Apple).
📖 В этом материале можно узнать, как использовать Metal в приложении, создавая собственные переходы (и анимации).
Ricardo Rachaus рассказывает о своем опыте работы с
Metal
и приводит пример, как применять Metal API в своих приложениях. 🛠 А вот в этом репозитории можно посмотреть код и попробовать создать собственную анимацию.
@iOS Dev
AsyncStream в Swift: определение и примеры использования
Вы можете связать свой существующий асинхронный код с новой системой Concurrency Swift, которая использует
Однако в некоторых случаях подход выше не сработает, например, если нужно реализовать: ход загрузки, текущее местоположение пользователя и другие подобные ситуации.
📖 В этом посте объясняется, как можно использовать
@iOS Dev
Вы можете связать свой существующий асинхронный код с новой системой Concurrency Swift, которая использует
async/await
(более подробно можно посмотреть здесь).Однако в некоторых случаях подход выше не сработает, например, если нужно реализовать: ход загрузки, текущее местоположение пользователя и другие подобные ситуации.
📖 В этом посте объясняется, как можно использовать
AsyncStream
для создания кастомных асинхронных последовательностей, которые будут выдавать значения по мере необходимости.@iOS Dev
5 способов передавать данные из UIKit в SwiftUI
Отправка данных из UIKit и SwiftUI может быть довольно непростой, однако существует несколько разных способов сделать это.
🗝 Ключ в том, чтобы найти метод, который лучше всего подходит для вашего проекта и ваших потребностей.
Интеграция SwiftUI и UIKit — это непрерывный процесс, и по мере развития технологий вскоре могут появиться новые методы.
Даже несмотря на то, что многим из нас приходится поддерживать старые версии iOS, будет полезно периодически пополнять базу знаний.
📖 В этом материале автор расскажет о следующих вариантах для передачи данных:
🔘View Initializer.
🔘Observable Objects.
🔘User Defaults.
🔘Environment Object.
🔘Notification Center.
@iOS Dev
Отправка данных из UIKit и SwiftUI может быть довольно непростой, однако существует несколько разных способов сделать это.
🗝 Ключ в том, чтобы найти метод, который лучше всего подходит для вашего проекта и ваших потребностей.
Интеграция SwiftUI и UIKit — это непрерывный процесс, и по мере развития технологий вскоре могут появиться новые методы.
Даже несмотря на то, что многим из нас приходится поддерживать старые версии iOS, будет полезно периодически пополнять базу знаний.
📖 В этом материале автор расскажет о следующих вариантах для передачи данных:
🔘View Initializer.
🔘Observable Objects.
🔘User Defaults.
🔘Environment Object.
🔘Notification Center.
@iOS Dev
URLSession: распространенные ошибки при выполнении задач фоновой загрузки и скачивания
Все, кто так или иначе работал с URLSession, понимают, что иногда возникают сложности при реализации загрузки нескольких файлов или работе в бэкграунде.
Реализация поддержки передачи данных в фоновом режиме сопряжена со множеством подводных камней.
Например, Xcode debugger может помешать в отладке, а реальное устройство, наоборот, помочь.
📖 В этом посте автор делится своим опытом о столкновении с некоторыми распространенными ловушками.
Кстати, рекомендую прочесть про способ ожидания подключения к интернету.
А ещё есть материал о написании API-клиента с использованием async/await.
@iOS Dev
URLSession
позволяет загружать и загружать файлы, когда приложение работает в фоновом режиме. Все, кто так или иначе работал с URLSession, понимают, что иногда возникают сложности при реализации загрузки нескольких файлов или работе в бэкграунде.
Реализация поддержки передачи данных в фоновом режиме сопряжена со множеством подводных камней.
Например, Xcode debugger может помешать в отладке, а реальное устройство, наоборот, помочь.
📖 В этом посте автор делится своим опытом о столкновении с некоторыми распространенными ловушками.
Кстати, рекомендую прочесть про способ ожидания подключения к интернету.
А ещё есть материал о написании API-клиента с использованием async/await.
@iOS Dev
Пример работы с async let для параллельного выполнения фоновых задач в Swift
📱Задача для реализации поддержки отзывчивого пользовательского интерфейса — одна из наиболее приоритетных при разработке.
Но бывают такие случаи, когда вызывается несколько методов в фоновом режиме, и по умолчанию эти вызовы выполняются последовательно.
📖 В этом материале на примере имитации загрузки файлов объясняется, как можно использовать
@iOS Dev
📱Задача для реализации поддержки отзывчивого пользовательского интерфейса — одна из наиболее приоритетных при разработке.
async/await
предоставляет чистый механизм для выполнения асинхронных задач. Но бывают такие случаи, когда вызывается несколько методов в фоновом режиме, и по умолчанию эти вызовы выполняются последовательно.
async let
возвращается немедленно, позволяя коду перейти к следующему вызову, и уже затем все возвращенные объекты можно ожидать вместе (используя await
).📖 В этом материале на примере имитации загрузки файлов объясняется, как можно использовать
async let
.@iOS Dev
Шпаргалка по Swift DateFormatter с формулами и примерами
⏳Управление и в целом форматирование дат в Swift — частая задача при разработке.
📖 В этом посте представлены примеры работы с
@iOS Dev
⏳Управление и в целом форматирование дат в Swift — частая задача при разработке.
📖 В этом посте представлены примеры работы с
DateFormatter
, Date
и другими структурами, которые позволяют анализировать, форматировать и извлекать компоненты из дат и строк.@iOS Dev
Пример реализации загрузки файла на сервер без использования сторонних библиотек на Swift
По этой ссылке немного вводной теории:
🌐 Что такое multipart/form-data?
В двух словах, как работает уровень HTTP: вы отправляете некоторые данные с некоторыми заголовками на заданный URL-адрес, используя метод, и в качестве ответа вы получите код состояния, некоторые заголовки и, возможно, что-то вроде данных ответа.
🔘
🔘
📖 В своей статье Tibor Bödecs рассказывает, как реализовать это, используя Swift, и приводит примеры кода.
@iOS Dev
По этой ссылке немного вводной теории:
🌐 Что такое multipart/form-data?
В двух словах, как работает уровень HTTP: вы отправляете некоторые данные с некоторыми заголовками на заданный URL-адрес, используя метод, и в качестве ответа вы получите код состояния, некоторые заголовки и, возможно, что-то вроде данных ответа.
🔘
HTTP request = Method + URL + Headers + Body (request data)
🔘
HTTP response = Status code + Headers + Body (response data)
📖 В своей статье Tibor Bödecs рассказывает, как реализовать это, используя Swift, и приводит примеры кода.
@iOS Dev
Вычисление математических выражений с помощью Swift
От научного калькулятора до приложения для работы с электронными таблицами
Арифметические выражения могут быть записаны в одной из трех форм нотаций:
Несмотря на то, что инфиксную нотацию труднее всего обрабатывать на компьютерах, она представляет собой то, как выражения пишутся и распознаются людьми.
Однако, поскольку инфиксные выражения не подходят для простого вычисления, их следует преобразовать либо в префиксную, либо в постфиксную нотацию.
В двух больших материалах Elina Semenko рассказывает о каждом типе нотаций, совершает краткий экскурс в историю, и объясняет на примерах необходимые преобразовнаия, используя Swift.
📖 Первая часть. Преобразование инфиксных выражений в постфиксные выражения.
📖 Вторая часть. Улучшение алгоритма и пример использования NSExpression.
Бонусом рассматривается применение фреймворка
@iOS Dev
От научного калькулятора до приложения для работы с электронными таблицами
Арифметические выражения могут быть записаны в одной из трех форм нотаций:
infix
, prefix
, postfix
.Несмотря на то, что инфиксную нотацию труднее всего обрабатывать на компьютерах, она представляет собой то, как выражения пишутся и распознаются людьми.
Однако, поскольку инфиксные выражения не подходят для простого вычисления, их следует преобразовать либо в префиксную, либо в постфиксную нотацию.
В двух больших материалах Elina Semenko рассказывает о каждом типе нотаций, совершает краткий экскурс в историю, и объясняет на примерах необходимые преобразовнаия, используя Swift.
📖 Первая часть. Преобразование инфиксных выражений в постфиксные выражения.
📖 Вторая часть. Улучшение алгоритма и пример использования NSExpression.
Бонусом рассматривается применение фреймворка
JavaScriptCore
(в чём может быть польза, и почему его стоит использовать в очень редких ситуациях).@iOS Dev
This media is not supported in your browser
VIEW IN TELEGRAM
Реализация видеоплеера на Swift с помощью RealityKit
Apple продолжает исследование и изредка появляются анонсы об очках за $ 3 000. На мой взгляд, не стоит недооценивать потенциальный пул аудитории, которая захочет (и сможет) их себе позволить, и поэтому для прокачивания этой области изредка можно изучать и обращать внимание на связанные с технологией вещи.
Например, зачем необходим огромный физический телевизор, если вы можете транслировать свой контент на виртуальный, который можно разместить где угодно.
К слову, энтузисты продолжают изучать различные возможности RealityKit, и некоторые вещи реализовать намного проще, чем кажется.
📖 Например, David Cordero показывает, что создать плеер, используя этот фреймворк, совсем несложно.
@iOS Dev
Apple продолжает исследование и изредка появляются анонсы об очках за $ 3 000. На мой взгляд, не стоит недооценивать потенциальный пул аудитории, которая захочет (и сможет) их себе позволить, и поэтому для прокачивания этой области изредка можно изучать и обращать внимание на связанные с технологией вещи.
Например, зачем необходим огромный физический телевизор, если вы можете транслировать свой контент на виртуальный, который можно разместить где угодно.
К слову, энтузисты продолжают изучать различные возможности RealityKit, и некоторые вещи реализовать намного проще, чем кажется.
📖 Например, David Cordero показывает, что создать плеер, используя этот фреймворк, совсем несложно.
@iOS Dev
Каким будет результат выполнения кода со скриншота выше?
Anonymous Quiz
40%
true
23%
false
1%
nil
27%
Код не скомпилируется
9%
Код скомпилируется, но будет ошибка в рантайме
iOS Dev
Каким будет результат выполнения кода со скриншота выше?
Как ожидалось, голоса разделились
Не переживайте, если не угадали правильный ответ, сейчас всё объясню
Иногда Swift может быть сложнее, чем кажется на первый взгляд, и таить в себе подводные камни, о которых помнить всегда довольно непросто. Хотя, казалось бы, что сложного в соответствии Equatable.
Почему сравнение двух массивов с одинаковым содержимым возвращает false?
🔘 Тип Array связан с классом Foundation NSArray (подробнее тут ).
🔘 NSArray не объявляет функцию ==(_:_:), поэтому он возвращается к функции NSObject ==(_:_:), которая вызывает isEqual.
🔘 isEqual NSArray сравнивает объекты путем приведения к AnyHashable .
И поэтому используется реализация NSObject ==(_:_:), а не реализация A.
Реализация NSObject ==(_:_:) проверяет isEqual, которая возвращает false, поскольку два элемента не совпадают в памяти.
Что сделать, чтобы получить true?
Лучший способ — заставить подкласс NSObject использовать кастомный isEqual с помощью override.
Кстати, если изначально сделать A структурой или обычным классом, для [A] не будет определено ==(_:_:). И вот как раз в этом случае компилятор поймает нашу ошибку.
И one more thing:
Если вы используете Swiftlint, на самом деле есть правило nsobject_prefer_isequal, которое можно использовать.
❔ Источник вопроса: Noah Gilmore .
@iOS Dev — неочевидные ответы на любопытные вопросы
Не переживайте, если не угадали правильный ответ, сейчас всё объясню
Почему сравнение двух массивов с одинаковым содержимым возвращает false?
🔘
🔘
🔘
И поэтому используется реализация NSObject ==(_:_:), а не реализация A.
Реализация NSObject ==(_:_:) проверяет isEqual, которая возвращает false, поскольку два элемента не совпадают в памяти.
Что сделать, чтобы получить true?
Лучший способ — заставить подкласс NSObject использовать кастомный isEqual с помощью override.
Кстати, если изначально сделать A структурой или обычным классом, для [A] не будет определено ==(_:_:). И вот как раз в этом случае компилятор поймает нашу ошибку.
И one more thing:
Если вы используете Swiftlint, на самом деле есть правило nsobject_prefer_isequal, которое можно использовать.
@iOS Dev — неочевидные ответы на любопытные вопросы
Please open Telegram to view this post
VIEW IN TELEGRAM
Посмотрите, какие репозитории пользуются наибольшей популярностью у разработчиков
Иван в своём канале собрал статистику по самым успешным репозиториям для iOS, и если алгоритмы на Swift ожидаемо в топ-5, то, например, активно продвигаемый фреймворк Wave для анимаций от
Janum Trivedi набрал свои звёзды благодаря крутым примерам из твиттера (и не в последнюю очередь благодаря вашим отзывам после этого поста).
🤩 Кстати, недавно Apple обновили свой курс для разработчиков, и об этом можно почитать вот тут:
🌐 Анонс Apple курса для разработчиков длительностью в 14 часов
@iOS Dev – сам топ смотрите ниже😉
Иван в своём канале собрал статистику по самым успешным репозиториям для iOS, и если алгоритмы на Swift ожидаемо в топ-5, то, например, активно продвигаемый фреймворк Wave для анимаций от
Janum Trivedi набрал свои звёзды благодаря крутым примерам из твиттера (и не в последнюю очередь благодаря вашим отзывам после этого поста).
🌐 Анонс Apple курса для разработчиков длительностью в 14 часов
@iOS Dev – сам топ смотрите ниже😉
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Код Воробья для iOS разработчиков
Топ-5 репозиториев, которые набрали больше всего звёзд ⭐️ на GitHub за 2022 год:
- Алгоритмы на Swift от Apple.
- Приложение на SwiftUI с общим кодом для Mac, iPad и iPhone. Тоже от Apple.
- DivKit рисует интерфейс с сервера. Проект Яндекса.
- Настраиваемые spring-анимации.
- Графики на Swift Charts.
В нашем чате ежедневно приходит топ-репозиториев за день.
- Алгоритмы на Swift от Apple.
- Приложение на SwiftUI с общим кодом для Mac, iPad и iPhone. Тоже от Apple.
- DivKit рисует интерфейс с сервера. Проект Яндекса.
- Настраиваемые spring-анимации.
- Графики на Swift Charts.
В нашем чате ежедневно приходит топ-репозиториев за день.
Итерация сообщений веб-сокетов с помощью async/await в Swift
В iOS 13 мы получили возможность легко отправлять и получать данные с помощью веб-сокетов через URLSession.
С помощью
📖 В этом материале объясняется, как создать собственный механизм для удобного асинхронного перебора сообщений при использовании веб-сокетов, особое внимание уделяется
@iOS Dev
В iOS 13 мы получили возможность легко отправлять и получать данные с помощью веб-сокетов через URLSession.
С помощью
async/await
появилась возможность получать данные с серверов, используя ключевое слово await
.📖 В этом материале объясняется, как создать собственный механизм для удобного асинхронного перебора сообщений при использовании веб-сокетов, особое внимание уделяется
URLSessionWebSocketTask
и AsyncThrowingStream
.@iOS Dev
Передача данных в iOS: delegates, notifications, closures
Несомненно, это обязательные знания для каждого разработчика, независимо от того, является ли он новичком.
Знание доступных инструментов и методов, того, что работает лучше всего, где и когда, имеет решающее значение для правильного процесса разработки.
В конце концов, возможность отправлять сообщения и данные туда и обратно между классами — это одна из первых вещей, о которых должен узнать разработчик.
В этой статье рассматриваются следующие способы для обмена данными внутри приложения:
1️⃣ Паттерн delegate.
2️⃣ Notifications (они же уведомления).
3️⃣ Closures & action handlers.
🛠 Код доступен по ссылке на Github.
Кстати, если вы хотите узнать о способах обмен данными между приложениями, то рекомендую посмотреть вот тут.
@iOS Dev
Несомненно, это обязательные знания для каждого разработчика, независимо от того, является ли он новичком.
Знание доступных инструментов и методов, того, что работает лучше всего, где и когда, имеет решающее значение для правильного процесса разработки.
В конце концов, возможность отправлять сообщения и данные туда и обратно между классами — это одна из первых вещей, о которых должен узнать разработчик.
В этой статье рассматриваются следующие способы для обмена данными внутри приложения:
1️⃣ Паттерн delegate.
2️⃣ Notifications (они же уведомления).
3️⃣ Closures & action handlers.
🛠 Код доступен по ссылке на Github.
Кстати, если вы хотите узнать о способах обмен данными между приложениями, то рекомендую посмотреть вот тут.
@iOS Dev
Пример создания нативного приложения с использованием реализации Core ML Stable Diffusion от Apple
В декабре в Apple представили оптимизацию Core ML для Stable Diffusion в macOS 13.1 и iOS 16.2, а также код для начала развертывания на устройствах Apple Silicon.
Существует ряд причин, по которым развертывание Stable Diffusion на устройстве в приложении предпочтительнее серверного подхода.
1️⃣ Во-первых, конфиденциальность конечного пользователя защищена, поскольку любые данные, предоставленные пользователем в качестве входных данных для модели, остаются на устройстве пользователя.
2️⃣ Во-вторых, после первоначальной загрузки пользователям не требуется подключение к Интернету для использования модели.
3️⃣ Наконец, локальное развертывание этой модели позволяет разработчикам сократить или полностью исключить свои расходы, связанные с сервером.
🔗 В этом репозитории содержатся подробные инструкции по тестированию и развертыванию.
🔗 Пример реализации в нативном приложении на Swift.
Внимание, по очевидным причинам требования к совместимости довольно существенные:
🔘 macOS Ventura 13.1, iOS/iPadOS 16.2, Xcode 14.2.
🔘 Время работы:
~8s in macOS on MacBook Pro M1 Max (64 GB). Model: Stable Diffusion v2-base, ORIGINAL attention implementation, CPU + GPU.
23 ~ 30s on iPhone 13 Pro. Model: Stable Diffusion v2-base, SPLIT_EINSUM attention, CPU + Neural Engine, memory reduction enabled.
@iOS Dev
В декабре в Apple представили оптимизацию Core ML для Stable Diffusion в macOS 13.1 и iOS 16.2, а также код для начала развертывания на устройствах Apple Silicon.
Существует ряд причин, по которым развертывание Stable Diffusion на устройстве в приложении предпочтительнее серверного подхода.
1️⃣ Во-первых, конфиденциальность конечного пользователя защищена, поскольку любые данные, предоставленные пользователем в качестве входных данных для модели, остаются на устройстве пользователя.
2️⃣ Во-вторых, после первоначальной загрузки пользователям не требуется подключение к Интернету для использования модели.
3️⃣ Наконец, локальное развертывание этой модели позволяет разработчикам сократить или полностью исключить свои расходы, связанные с сервером.
🔗 В этом репозитории содержатся подробные инструкции по тестированию и развертыванию.
🔗 Пример реализации в нативном приложении на Swift.
Внимание, по очевидным причинам требования к совместимости довольно существенные:
🔘 macOS Ventura 13.1, iOS/iPadOS 16.2, Xcode 14.2.
🔘 Время работы:
~8s in macOS on MacBook Pro M1 Max (64 GB). Model: Stable Diffusion v2-base, ORIGINAL attention implementation, CPU + GPU.
23 ~ 30s on iPhone 13 Pro. Model: Stable Diffusion v2-base, SPLIT_EINSUM attention, CPU + Neural Engine, memory reduction enabled.
@iOS Dev
Поиск эффективного алгоритма для определения среднего цвета изображения
Поиск среднего цвета изображения — хороший трюк, который можно иметь в своем наборе инструментов для оживления ваших экранов.
Например, в iOS он используется Apple для создания своих красивых виджетов на хоумскрине.
Существует множество статей о том, как это сделать на iOS, но весь код, например, используя Core Image.
📖 Но, как рассказывает автор в этом материале, здесь могут быть свои подводные камни, и описывает ещё два подхода, которые можно использовать.
@iOS Dev
Поиск среднего цвета изображения — хороший трюк, который можно иметь в своем наборе инструментов для оживления ваших экранов.
Например, в iOS он используется Apple для создания своих красивых виджетов на хоумскрине.
Существует множество статей о том, как это сделать на iOS, но весь код, например, используя Core Image.
📖 Но, как рассказывает автор в этом материале, здесь могут быть свои подводные камни, и описывает ещё два подхода, которые можно использовать.
@iOS Dev
This media is not supported in your browser
VIEW IN TELEGRAM
Даже в сложных системах, и даже у Apple встречаются проблемы
Например, приложение часов macOS обновляет свой пользовательский интерфейс с помощью таймеров, и эти таймеры добавляются только в
А вот если бы они прочитали этот пост в нашем канале, то такой проблемы бы не было:
Полное руководство по использованию таймеров в Swift
@iOS Dev — на самом деле работа со временем может быть куда труднее
Например, приложение часов macOS обновляет свой пользовательский интерфейс с помощью таймеров, и эти таймеры добавляются только в
defaultRunLoopMode
, в результате чего пользовательский интерфейс перестает обновляться (попросту фризятся часы) при открытии и отслеживании меню.А вот если бы они прочитали этот пост в нашем канале, то такой проблемы бы не было:
Полное руководство по использованию таймеров в Swift
@iOS Dev — на самом деле работа со временем может быть куда труднее
Как отменить фоновую задачу в Swift при использовании async/await
Синтаксис
Асинхронное программирование может повысить производительность приложения, но важно иметь возможность отменять неиспользуемые таски, чтобы они не вмешивались в работу приложения.
📖 В этой статье показано, как явно отменить задачу, и показано, как при этом автоматически отменяются дочерние задачи.
Кроме этого, будет полезно перед этим прочесть и этот материал:
🌐 Пример работы с async let для параллельного выполнения фоновых задач в Swift
@iOS Dev
Синтаксис
async/await
, представленный в Swift 5.5, позволяет писать асинхронный код в удобочитаемом виде. Асинхронное программирование может повысить производительность приложения, но важно иметь возможность отменять неиспользуемые таски, чтобы они не вмешивались в работу приложения.
📖 В этой статье показано, как явно отменить задачу, и показано, как при этом автоматически отменяются дочерние задачи.
Кроме этого, будет полезно перед этим прочесть и этот материал:
🌐 Пример работы с async let для параллельного выполнения фоновых задач в Swift
@iOS Dev