Telegram Web Link
10 советов для успешного запуска пет-проектов от автора avanderlee

1️⃣ Создайте фокус. По иронии судьбы, сторонние проекты — одна из самых больших ловушек для незавершенных побочных проектов.
2️⃣ Смотрите на вещи реалистично. Вы не сможете сделать всё сразу! От себя я бы добавил, что этот совет касается разработки и в крупных компаниях.
3️⃣ Установите приоритеты.
4️⃣ Планирование — это ключ.
5️⃣ 10 минут в день засчитываются за 5 часов в месяц.
6️⃣ Умейте остановиться вовремя, даже если вы получаете удовольствие (и вы готовы кодить до полуночи).
7️⃣ Создайте задачи на будущее. А #warning вам поможет.
8️⃣ Используйте автоматизацию и инструменты, чтобы сэкономить время.
9️⃣ Поднимите себе настроение с друзьями-единомышленниками.
🔟 Не стесняйтесь отпраздновать успех (или хотя бы запуск проекта).

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

⭐️ А вот тут можно прочесть отличные от Пола Хадсона про профессиональное развитие.

@iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
Причина и два способа исправить ошибку: «The compiler is unable to type-check this expression in reasonable time»

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

Например, комбинация выражений =, +, try, await слишком сложна для компилятора Swift.

Два простых способа, которые помогут победить этот неприятный момент:

1️⃣ Разбить длинное выражение на более мелкие.

// Вместо
var longExpression = "a" + "b" + "c" + "d"

// Использовать
var temp1 = "a" + "b"
var temp2 = "c" + "d"
var smallerExpression = temp1 + temp2


2️⃣ Можно уменьшить количество выражений.

// Вместо
var longExpression = "a" + "b" + "c" + "d"

// Использовать
var reduceExpression = "ab" + "cd"


📖 Детальнее можно прочесть в этой статье.

👩‍🎓 Кстати, вы знали, что оператор + мощно перегружен и содержит около 60 различных функций?

@iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
UIScrollView и как он работает

📖 Илья Лобанов подробно рассказывает о том, как работает UIScrollView: приводит примеры замедления, баунса, spring animation и rubber band effect.

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

В материале можно получить представление и примеры работы со следующими эффектами:

🔘 Тестовый SimpleScrollView.
🔘 Замедление (Deceleration).
🔘 Реализация замедления.
🔘 Анимация пружины (Spring Animation).
🔘 Spring Animation в iOS SDK.
🔘 Реализация анимации пружины.
🔘 Rubber Band Effect.
🔘 Реализация Rubber Band Effect.
🔘 Примеры использования.

📺 Видео доклада можно посмотреть здесь.

🛠 Примеры кода из статьи: github.

🤩 Бонус: видео с WWDC о проектировании интерфейсов.

@iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
Channel photo updated
Настройка Shortcut Actions с параметрами для iOS-приложений с примером кода

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

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

🛠 Если же вы предпочитаете исследовать код, то готовый проект доступен по этой ссылке.

@iOS Dev
Core Graphics: что это, как появился и как на это повлияли деньги?

Core Graphics, также известный под своим маркетинговым названием «Quartz», является одним из старейших связанных с графикой API на платформах.

Quartz является основой большинства 2D-вещей. Хотите рисовать фигуры, заполнять их градиентами и придавать им тени? Это Core Graphics. Показывать изображения на экране? Они проходят через Core Graphics. Создавать PDF? Эм, ну это всё ещё Core Graphics.

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

Почему графический API работает с пользовательскими событиями?

Как и все для всего остального, нужно вспомнить историю. А знание истории может объяснить, почему части Core Graphics ведут себя именно так.

Еще в 1980-х, графические API были довольно примитивными. Инструменты были ограничены палитрой и рисовать можно было только основные фигуры. Существовали функции «побитового копирования».

В QuickDraw на Mac была интересная функция, называемая регионами для обрезки, контура или хиттеста (что-то знакомо?✅️)

В 1985 году Apple представила LaserWriter — принтер, мощнее компа, который имел в 12 раз больше оперативной памяти и стоил вдвое дороже. Этот принтер производил (для того времени) невероятно красивый результат благодаря технологии PostScript. Интерпретатор языка PostScript был встроен в LaserWriter, поэтому, когда программа на Mac хотела что-то напечатать, программа (или драйвер принтера) генерировала программный код, который загружался в принтер и выполнялся. А вот тут даже есть пример.

Помимо рендеринга страниц, PostScript является полным по Тьюрингу и вы даже можете написать веб-сервер с его помощью.

Когда инженеры NeXT проектировали свою систему, они выбрали PostScript в качестве модели рендеринга. Отображение PostScript было основой взаимодействия с пользователем. События проходили через систему DPS, а затем отправлялись в приложения.

Почему OS X и iOS не используют Display PostScript?

💵 Дело в деньгах! Adobe взимала лицензионный сбор за Display PostScript.

Кроме того, Apple хорошо известна тем, что хочет владеть как можно большей частью своего технологического стека.

Обычно говорят, что Quartz «основан» на PDF, и в некотором смысле это правда. PDF (Adobe's Portable Document Format) — это модель рисования PostScript.

Quartz был разработан так, чтобы использование API было на то, что поддерживается в PDF, что делало создание PDF-файлов на платформе почти тривиальным.

Те же основные механизмы были сохранены, хотя Display PostScript был заменен на Quartz, включая обработку событий.

🧐 Apple разработала новую структуру, объединив модель PDF с поддержкой альфа-канала, и сегодня мы знаем ее как Quartz 2D. Apple внутри компании называет эту графическую библиотеку Core Graphics, а общедоступное название — Quartz 2D.

📖 Источники при подготовке материала: Mihaela MJ, Mark Dalrymple, дока эпл и, конечно,

@iOS Devтеперь вы знаете больше!
Please open Telegram to view this post
VIEW IN TELEGRAM
DispatchSource: обнаружение изменений в файлах и папках в Swift

Семейство типов DispatchSource из GCD содержит ряд объектов, способных отслеживать события, связанные с операционной системой.

📖 В этой статье приводится хороший пример, как использовать DispatchSource для мониторинга лог-файла и создания debug-only view, которое покажет последние логи в приложении.

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

⭐️ Дополнительно: DispatchSource в доке эпла.

@iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
Ключевое слово Never в Swift: определение c примерами кода

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

Тип Never в Swift позволяет вам сообщить компилятору о точке выхода в вашем коде.

Это тип без значений, который предотвращает написание бесполезного кода.

Хотя сам по себе тип Never может быть малоизвестен, возможно, вы уже использовали его в своей кодовой базе (некоторые методы Swift юзают его по дефолту).

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

@iOS Dev
iOS Dev
Если ваше приложение использует только HTTPS или же шифрование только для аутентификации, и при этом вы устали каждый раз при отправке нажимать в диалоге одинаковые кнопки, то вы можете использовать следующий способ: <key>ITSAppUsesNonExemptEncryption</key>…
ℹ️ Обновление в App store при выкладке приложения

Расширили количество опций для соответствия экспортным требованиям.

Теперь можно выбирать из четырёх вариантов при ответе на вопрос о содержании алгоритмов шифрования:

1️⃣ Алгоритмы шифрования, которые являются частными или не принимаются в качестве стандартных международными организациями по стандартизации (IEEE, IETF, ITU и т. д.).

2️⃣ Стандартные алгоритмы шифрования вместо использования шифрования в составе операционной системы Apple или доступа к таковому (либо в дополнение к нему).

3️⃣ Оба вышеперечисленных алгоритма.

4️⃣ Ни один из вышеперечисленных алгоритмов.

И теперь подсказка про .plist форсится самим Apple явно (а пост выше был хаком аж полгода назад).

@iOS Dev
Правило трёх

ℹ️ Правило трёх или «Три страйка * — и вы проводите рефакторинг» — это эмпирическое правило рефакторинга кода, позволяющее решить, когда следует рефакторить похожие фрагменты кода, чтобы избежать дублирования.

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

Это правило было популяризировано Мартином Фаулером в книге «Рефакторинг» и приписано Дону Робертсу.

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

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

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

😂 Моя позиция совпадает с этим правилом. В частности, с тем, что крайне редко бывает чёрное и белое в целом в разработке, и не всегда стоит рефакторить только ради самого процесса.

* три страйка — термин из бейсбола, а не боулинга. Его суть в том, что если бьющий набирает три страйка — это называется страйк-аут (англ. strike-out) — бьющий выбывает из игры.

@iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
⚡️ Apple объявила о самом большом обновлении цен в App Store с момента запуска
Разработчики также получат больше гибкости для глобального управления ценообразованием

1️⃣ Добавлено 700 новых ценовых пунктов.

2️⃣ Будут добавлены новые инструменты для упрощения установки цен в каждом регионе, а также управление обменным курсом.

3️⃣ Доступно 45 валют в 175 магазинах для подписок c сегодняшнего дня. А с 2023 обещают внедрить это и для встроенных покупок.

4️⃣ В рамках обновленной системы ценообразования в App Store все разработчики смогут выбирать из 900 ценовых пунктов, что почти в 10 раз превышает ранее доступное количество. 100 более высоких ценовых категорий, доступны по запросу. Например, в рублях максимальная цена теперь может быть целых 900 000.

Чтобы предоставить разработчикам по всему миру еще большую гибкость, цены можно будет выставить с $ 0,29 и шагом в 10 центов вплоть до $10 000 долларов. Вспоминаем приложение I am rich?

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

📄 Документ со всеми возможными ценами доступен здесь.

🔗 Первоисточник.

@iOS Dev
Пример создания простого виджета с помощью WidgetKit

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

С тех пор он постепенно превратился в платформу, которая поддерживает некоторые из наиболее ожидаемых функций в iOS 16, а именно виджет блокировки экрана, Live Activities и Dynamic Island.

📖 Эта статья будет полезна новичкам и тем, кто впервые делает виджет для Home Screen.

📖 А вот тут можно прочесть и о другом примере.

@iOS Dev
Как заставить сетевой запрос ожидать подключения к Интернету с помощью waitsForConnectivity

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

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

По умолчанию система будет ждать семь дней, чтобы узнать, станет ли доступно подключение к Интернету, но это можно контролировать с помощью свойства timeoutIntervalForResource в вашем конфиге.

ℹ️ Например, вы можете установить интервал с помощью:

config.timeoutIntervalForResource = 60

@iOS Dev
Как создать идеальный пайплайн (конвейер) на базе Fastlane для iOS

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

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

Что, если бы вы могли запустить одну команду, чтобы позаботиться обо всех этих требованиях к отправке?

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

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

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

☁️ И кстати, возможно пора уже наконец, использовать Xcode cloud?

@iOS Dev
🧑‍💻 Foundation перепишут на Swift и теперь он будет разрабатываться сообществом!
Фреймворк Foundation используется почти во всех проектах Swift. Он обеспечивает базовый уровень функциональности для фундаментальных вещей: строк, коллекций и дат.

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

1️⃣ Больше никакого C-кода.

С нативной реализацией на свифте в Foundation не будет затрат на преобразования между C и Swift, что приведёт к более высокой производительности.
Реализация Swift, разработанная в виде пакета, также упростит для разработчиков Swift проверку, понимание и добавление кода.

2️⃣ Будет предоставлена опция импорта только нужных пакетов.

FoundationEssentials, FoundationInternationalization, FoundationNetworking, FoundationXML, FoundationObjCCompatibility.

Разработчики (и пользователи!) хотят уменьшить размер бинарников, поэтому, например, FoundationEssentials предоставит наиболее важные типы в Foundation без системных зависимостей, чтобы помочь в достижении этой цели. Другие пакеты будут по-прежнему обеспечивать поддержку XML и работу в сети.
Кроме этого, новый пакет FoundationObjCCompatibility будет содержать устаревшие API, полезные для определенных приложений.

3️⃣ Реализация Foundation будет унифицирована.

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

Кроме вышеперечисленного, будет достигнута и цель для сообщества.

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

🎉 Анонсирована возможность разработчикам добавлять API в Foundation.

📖 Больше деталей, а ещё и возможность обсудить — здесь, первоисточник — тут.

@iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
😧 RunLoop больше не будет доступен. И вот почему

На платформах Darwin разработчики Apple обязаны поддерживать совместимость со всеми существующими API.

Однако они решили сосредоточить нашу новую унифицированную реализацию на наиболее полезные API-интерфейсы Swift.

Это означает отход от цели swift-corelibs-foundation о 100% совместимости исходного кода.

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

🔘 RunLoop, Lock, OperationQueue, Stream, Port, Timer и т. д. — заменены структурированным параллелизмом.

🔘 Коллекции с NS-префиксами — изначально предусмотрены для совместимости, но полезность очень мала.

🔘 NSCoding, NSKeyedArchiver — заменены на Codable.

🔘 Progress — внешних зависимостей нет, но пересечение со структурированным параллелизмом еще не полностью разработано.

А вот на Darwin платформа Foundation продолжит поддерживать реализации этих типов в сочетании C, Objective-C и Swift.

@iOS Dev
Полное руководство по работе с URL в Swift (и SwiftUI)

URL-адреса используются повсеместно, и приложения для iOS не являются исключением.

Наиболее распространенными примерами являются веб-контент, локальные файлы и конечные точки REST API.

📖 В этой статье разбираются пошагово следующие аспекты:

1️⃣ Что такое URL и как использовать URL в Swift.

2️⃣ Как URL-адреса идентифицируют локальные и веб-ресурсы.

3️⃣ Управление URL и преобразование их в более удобные типы.

4️⃣ Создание URL-адреса и проверка его отдельных компонентов.

5️⃣ Использование URL для чтения и записи в файловой системе устройства.

6️⃣ Показаны примеры работы с URL-адресами в приложениях SwiftUI.

Рекомендую после этого материала ознакомиться и с более любопытной темой:

📖 Создание переиспользуемой системы для сложных URL-запросов с помощью Swift.

@iOS Dev
Семафоры в Swift и что это такое: определение, немного теории и примеры

ℹ️ Семафоры дают нам возможность контролировать доступ к общему ресурсу. Сам семафор состоит из очереди потоков и значения счетчика (типа Int).

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

Значение счетчика используется семафором, чтобы решить, должен ли поток получить доступ к общему ресурсу или нет. При этом оно изменяется, когда мы вызываем signal() или wait().

📖 В этом материале буквально на пальцах объясняется:

🔘 Что такое семафоры.

🔘 Принципы работы семафоров.

🔘 А также автор приводит два примера для упрощения понимания.

@iOS Dev
Давайте остановим фильтрацию на секунду: альтернативные способы обработки коллекций

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

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

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

В статье акцентировано внимание на removeAll(where:), contains(where:), allSatisfy(predicate:), reduce и first(where:).

Конечно же, с примерами.

@iOS Dev
This media is not supported in your browser
VIEW IN TELEGRAM
RunLoop.main и DispatchQueue.main: объяснение различий

RunLoop.main и DispatchQueue.main часто используются в качестве планировщиков в Combine.

📖 Во время код-ревью автор материала сталкивался с непоследовательностью в использовании обоих, и решил объяснить, в чём различия. Статья разбита на следующие блоки:

1️⃣ Что такое RunLoop.main.

2️⃣ Что такое DispatchQueue.main.

3️⃣ Различия между RunLoop.main и DispatchQueue.main.

4️⃣ Нужно ли использовать RunLoop.main?

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

@iOS Dev
2025/02/23 19:14:25
Back to Top
HTML Embed Code: