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

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

#ios #mobile #swift
加入频道
Подробное объяснение Enum с примерами кода в Swift

Конечно, Enum широко используется в в Swift: If case, guard case, fallthrough и протокол CaseIterable.

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

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

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

ℹ️ Кстати, про 3 способа использования enum, которые должны быть в вашем арсенале, можно прочесть здесь.

@iOS Dev
👍34🔥5👏52
Многопоточность в Swift

Подборка материалов для подготовки к собеседованиям

Ключевые темы этого поста: GCD (Grand Central Dispatch), Async/Await, Deadlock, Race Condition, Data race, Thread Explosion, Semaphore

🗒 Для удобства материалы разбиты на два блока, подборка будет дополняться по традиции с прошлым блоком:

🔗 Память, ссылки, side table и многое другое

🇷🇺 Материалы на русском языке

🔗 Многопоточность (concurrency) в Swift: GCD и Dispatch Queues

🔗 Concurrency в Swift, Operation и OperationQueue

🔗 Полное руководство по параллелизму и многопоточности в iOS

🔗 Про многопоточность: Thread и GCD

🔗 Structured concurrency в Swift

🔗 Многопоточность: Примитив синхронизации Semaphore🚦

🔗 Простое определение проблем многопоточки: Race Condition vs Data Race

🏴󠁧󠁢󠁥󠁮󠁧󠁿 Материалы на английском языке

🔗 Grand Central Dispatch: от определения к низкоуровневым примитивам

🔗 Grand Central Dispatch: многопоточность, очереди, параллелизм (две части)

🔗 Объяснение параллелизма: как создать многопоточное приложение для iOS

🔗 Swift Concurrency — вещи, о которых вам не говорят (и почему Actor - тихий убийца вашего кода, а Tasks - бутылочное горлышко)

🔗 Grand Central Dispatch (GCD) Tutorial in Swift 5 за авторством Вадима Булавина

🔗 Несложный блок вопросов в целом по Concurrency

Что почитать ещё?

🔗 Реализация API-клиента для работы с запросами в Swift с использованием Async/Await

🔗 Как приостановить Task в Swift?

🔗 Разбор вариантов рефакторинга в Xcode для async/await

🔗 Создание и планирование локальных уведомлений с помощью async/await

🔗 Async/await в Swift c примером использования на базе существующего проекта

🔗 Итерация сообщений веб-сокетов с помощью async / await в Swift

Лучшее спасибо👍❤️🔥👏🎉❤️‍🔥.

@iOS Dev — из этого канала кое-что точно можно сохранить себе😅
🔥117👍1514❤‍🔥8👏6🏆3🎉2👨‍💻2
iOS Dev pinned «Многопоточность в Swift Подборка материалов для подготовки к собеседованиям Ключевые темы этого поста: GCD (Grand Central Dispatch), Async/Await, Deadlock, Race Condition, Data race, Thread Explosion, Semaphore 🗒 Для удобства материалы разбиты на два блока…»
Путь в тысячу ли начинается с первого шага

Эту цитату я когда-то уже упоминал, и, безусловно, она не теряет актуальности в преддверии нового года.

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

👩‍🎓 В качестве примера могу привести одну притчу: Будда хотел передал приглашение коту, но тот в силу своей природной лени решил поспать и пропустил собрание, и поэтому год стал называться в честь другого пушистого — кролика.

В моём канале вы не найдете советы про несколько работ одновременно или про то, как быть экспертом во всём сразу. Я не вхожу в топ-5 айосеров по некоторым рейтингам и не стремлюсь заполнить инфополе белым шумом.

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

2023 на пороге. Проведите это время с теми, кто важен для вас. А поскольку пост начался с цитаты, то ею же я и постараюсь закончить:

If you haven't found it yet, keep looking. (Если вы еще не нашли того, что искали, продолжайте поиски.) — Стив Джобс

@iOS Dev — мира нам всем ❤️‍🔥
Please open Telegram to view this post
VIEW IN TELEGRAM
❤‍🔥57👍156🔥5🎄32🎉2🤩1💯1🎅1
Как поддерживать несколько виджетов при использовании WidgetKit?

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

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

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

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

1️⃣ Использование widget bundle.

2️⃣ Наличие нескольких расширений.

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

@iOS Devнемного отдохнули, а теперь пора в 2023
🔥13👍8👏21💯1
ArraySlice с примерами использования: оператор range и prefix

Перед прочтением материала ниже попробуйте ответить:

📊 вот на этот вопрос

Стандартная библиотека Swift предоставляет ArraySlice для работы с подмножеством большей коллекции без ненужных расходов на создание копии.

Получить первые несколько элементов коллекции можно с помощью использования range, но безопаснее использовать метод prefix, не беспокоясь об исключении out of range.

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

@iOS Dev
👍202🔥2💯21🤩1
10 различных способов реализации перебора в Swift

Один из самых важных элементов программирования, о котором большинство из нас не задумывается — это циклы.

Без них жизнь в мире программирования была бы почти невозможна.

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

@iOS Dev
👍16🌚43🔥3👏1💯1
Почему использование isEmpty быстрее, чем проверка count == 0?

Чтобы понять, почему isEmpty быстрее, чем count == 0 для строк, нам нужно углубиться в то, как строки работают в Swift на самом деле.

Строки Swift представляют собой сложные наборы символов, в которых несколько символов могут объединяться вместе, образуя одну букву, видимую пользователям.

Например, такой простой смайлик, как британский флаг 🇬🇧, на самом деле состоит из двух разных символов: «G» и «B».

Символы Unicode, если их поставить рядом, автоматически станут британским флагом.

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

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

📖 В этом материале приводится детальное объяснение смелого заявления на примерах.

@iOS Dev
👍52🔥94👏2💯1
This media is not supported in your browser
VIEW IN TELEGRAM
Кастомные анимации переходов между UIViewController с использованием Metal

Metal — это низкоуровневый API для программирования GPGPU (General Purpose Graphics Processing Unit).

Довольно часто многие боятся использовать новые API из-за недостатка знаний о том, что может предоставить инструмент, а также из-за отсутствия информации, доступной в Интернете для изучения (иногда это ограничивается скудной документацией Apple).

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

Ricardo Rachaus рассказывает о своем опыте работы с Metal и приводит пример, как применять Metal API в своих приложениях.

🛠 А вот в этом репозитории можно посмотреть код и попробовать создать собственную анимацию.

@iOS Dev
🔥46👍8🆒3👏2🤣2🏆2❤‍🔥11💯1
AsyncStream в Swift: определение и примеры использования

Вы можете связать свой существующий асинхронный код с новой системой Concurrency Swift, которая использует async/await (более подробно можно посмотреть здесь).

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

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

@iOS Dev
👍16🔥5👏21🤯1
5 способов передавать данные из UIKit в SwiftUI

Отправка данных из UIKit и SwiftUI может быть довольно непростой, однако существует несколько разных способов сделать это.

🗝 Ключ в том, чтобы найти метод, который лучше всего подходит для вашего проекта и ваших потребностей.

Интеграция SwiftUI и UIKit — это непрерывный процесс, и по мере развития технологий вскоре могут появиться новые методы.

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

📖 В этом материале автор расскажет о следующих вариантах для передачи данных:

🔘View Initializer.
🔘Observable Objects.
🔘User Defaults.
🔘Environment Object.
🔘Notification Center.

@iOS Dev
👍223🔥3👏3🌚3💯1
URLSession: распространенные ошибки при выполнении задач фоновой загрузки и скачивания

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

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

Реализация поддержки передачи данных в фоновом режиме сопряжена со множеством подводных камней.

Например, Xcode debugger может помешать в отладке, а реальное устройство, наоборот, помочь.

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

Кстати, рекомендую прочесть про способ ожидания подключения к интернету.
А ещё есть материал о написании API-клиента с использованием async/await.

@iOS Dev
👍24🔥6👏21💯1
Пример работы с async let для параллельного выполнения фоновых задач в Swift

📱Задача для реализации поддержки отзывчивого пользовательского интерфейса — одна из наиболее приоритетных при разработке.

async/await предоставляет чистый механизм для выполнения асинхронных задач.

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

async let возвращается немедленно, позволяя коду перейти к следующему вызову, и уже затем все возвращенные объекты можно ожидать вместе (используя await).

📖 В этом материале на примере имитации загрузки файлов объясняется, как можно использовать async let.

@iOS Dev
👍20🔥7😐21👏1🤗1
Шпаргалка по Swift DateFormatter с формулами и примерами

Управление и в целом форматирование дат в Swift — частая задача при разработке.

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

@iOS Dev
🔥28👍83👏2🏆1
Пример реализации загрузки файла на сервер без использования сторонних библиотек на Swift

По этой ссылке немного вводной теории:

🌐 Что такое 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
👍19🔥3👏2🆒21
Вычисление математических выражений с помощью Swift
От научного калькулятора до приложения для работы с электронными таблицами

Арифметические выражения могут быть записаны в одной из трех форм нотаций: infix, prefix, postfix.

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

Однако, поскольку инфиксные выражения не подходят для простого вычисления, их следует преобразовать либо в префиксную, либо в постфиксную нотацию.

В двух больших материалах Elina Semenko рассказывает о каждом типе нотаций, совершает краткий экскурс в историю, и объясняет на примерах необходимые преобразовнаия, используя Swift.

📖 Первая часть. Преобразование инфиксных выражений в постфиксные выражения.

📖 Вторая часть. Улучшение алгоритма и пример использования NSExpression.

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

@iOS Dev
👍13🔥4👏21💯1
This media is not supported in your browser
VIEW IN TELEGRAM
Реализация видеоплеера на Swift с помощью RealityKit

Apple продолжает исследование и изредка появляются анонсы об очках за $ 3 000. На мой взгляд, не стоит недооценивать потенциальный пул аудитории, которая захочет (и сможет) их себе позволить, и поэтому для прокачивания этой области изредка можно изучать и обращать внимание на связанные с технологией вещи.

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

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

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

@iOS Dev
🔥22👍83👏2🤩2💯1🤗1
Внимание, вопрос!
🔥7👍4👏2🤔2👨‍💻21👌1🆒1
Каким будет результат выполнения кода со скриншота выше?
Anonymous Quiz
40%
true
23%
false
1%
nil
27%
Код не скомпилируется
9%
Код скомпилируется, но будет ошибка в рантайме
👍17😐15🔥7🫡31👏1
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 — неочевидные ответы на любопытные вопросы
Please open Telegram to view this post
VIEW IN TELEGRAM
👍62👏11😐7🔥64🆒3🤗1
Посмотрите, какие репозитории пользуются наибольшей популярностью у разработчиков

Иван в своём канале собрал статистику по самым успешным репозиториям для iOS, и если алгоритмы на Swift ожидаемо в топ-5, то, например, активно продвигаемый фреймворк Wave для анимаций от
Janum Trivedi набрал свои звёзды благодаря крутым примерам из твиттера (и не в последнюю очередь благодаря вашим отзывам после этого поста).

🤩 Кстати, недавно Apple обновили свой курс для разработчиков, и об этом можно почитать вот тут:

🌐 Анонс Apple курса для разработчиков длительностью в 14 часов

@iOS Dev – сам топ смотрите ниже😉
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11🔥7👏2🎉1💯1🏆1🆒1