iOS разработчик, который делится фишками, своим опытом и опытом других.
В этом канале вы сможете найти истории из жизни, подходы к реализации а также новости и тренды из мира iOS-разработки
Авторский канал, iOS разработка
Лучшие практики для TCA (The Composable Architecture)
Команда The Browser Company активно использует структуру Composable Architecture (об их любопытном способе организации SPM можно почитать вот тут).
Krzysztof Zabłocki на основе своего опыта разработал новый набор лучших практик, которые могут принести пользу проектам, использующим эту архитектуру.
📖 В этом материале перечислены методы, которые могут помочь оптимизировать производительность и стабильность ваших проектов.
📖 Кстати, здесь сообщество делится рекомендациями (и вы можете добавить свои).
😃 iOS Dev
Профсоюз разработчиков добился от Apple специальной пометки приложений, сделанных нейросетью
Можно выдохнуть!
В течение последних двух с половиной недель после выхода GPT-4 разработчики в Твиттере добивались отмены, или так называемого кэнселлинга приложений, сделанных нейросетями с помощью специального тега #stopAI #freedomForMankind.
Эта инициатива дошла до Тима Кука, который был вынужден прервать рабочую поездку в восточную Азию и созвониться с отделом ревью приложений.
Кто-то даже переслал ему сравнительный анализ решения задач на литкоде.
После нескольких дней напряженных дискуссий всё-таки было принято два важных решения:
1️⃣ Теперь при выкладке приложений нужно будет указывать поколение и тип нейросети.
2️⃣ Все приложения в App Store получат специальную пометку в виде иконки и дополнительного тега, если они сделаны нейросетью.
😃 iOS Dev - будем надеяться, что это поможет. Больше подробностей принятых решений можно узнать в видеообзоре от 9to5mac.
Краткое руководство по таблицам SwiftUI
Таблицы с несколькими столбцами уже давно являются функцией macOS, на iOS они появились только с iOS 16.
Конечно, есть некоторые особенности использования, но в целом работать с ними несложно.
Например, сортировку по столбцам можно добавить буквально в пару строк (как тут).
@State private var sortOrder = [KeyPathComparator(\Country.name)]
var body: some View {
Table(store.countries, selection: $selected,
sortOrder: $sortOrder) { ... }
}
📖 А об остальных особенностях таблиц на SwiftUI можно узнать из этого материала.
😃 iOS Dev
2000 импортов: история об организации модулей SwiftPM
Автор делится размышлениями об использовании @_exported import, объединении в один CoreDependencies и использовании этого решения в проекте.
И хотя способ кажется неплохим, в разработке есть свои сложности (куда же без них).
Например, потенциальное отсутствие группировки не только затрудняет поиск нужного модуля, но может привести к циклическим зависимостям.
Это требует стратегического планирования для предотвращения будущих ошибок компилятора.
📖 В этом материале пойдет речь про способ для упорядочивания модулей для ясности и удобства, используя скрытую (неофициальную) функцию Swift.
🧐 Кстати, этот способ, похоже, используют и авторы Point-Free в либе TCA (The Composable Architecture).
😃 iOS Dev
Интересная анимация изменения температуры на SwiftUI
🤩 Разработчик рассказывает, как за 10 часов, впервые попробовав SwiftUI, ему удалось создать эту анимацию, которая у некоторых может вызвать ностальгию по симуляторам вроде iBeer.
🛠 Код доступен на github, для запуска только дропните неиспользуемые ассеты.
Раньше я скидывал и свой пример создания анимации как в Wallet тоже на SwiftUI (так что пора собирать мини-коллекцию).
😃 iOS Dev
Советы по отладке или в чём разница между po, v и vo
📖 Кшиштоф Заблоцки делится любимыми приемами и советами по отладке, которые он использует при работе над Swift-проектами.
В частности, вы сможете узнать:
1️⃣ Как настроить кастомный .lldbinit.
2️⃣ Когда лучше использовать po, и в чём разница между po и v.
3️⃣ Как добавить свой брейкпоинт, используя lldb.
😃 iOS Dev
Lines — наглядная утилита для оценки размера ваших файлов в проекте
Проект, над которым мы трудимся в рабочее время, довольно крупный. Настолько, что более половины кода в нём до сих пор на Objective-C.
И хотя вся новая функциональность, конечно же, пишется на Swift, часть требует обновлений.
Недавно мы нашей командой решили основательно взяться за рефакторинг, но как понять, что брать за точку отсчёта?
Для этого можно воспользоваться этим решением. Или попытаться использовать способ отсюда с 11к звёзд на github (но на M1 могут возникнуть проблемы с зависимостями).
Для своих целей я реализовал несложную утилиту с модными async/await и диаграммами со SwiftUI, и решил, что вполне могу поделиться с сообществом, если кому-то пригодится.
Что есть полезного из фич:
1️⃣ Возможность ограничить расширения файлов (или убрать все - но тогда утилита попытается перебрать все файлы в вашем проекте).
2️⃣ Показ суммарного количества строк по каждому расширению. Если выбрано, например, только swift, то будет отображаться топ самых крупных файлов (с возможностью сортировки).
3️⃣ Есть опция перехода к файлу по двойному клику.
🧑💻 Доступно на Gumroad (бесплатно).
👨💻 В маковском сторе пока ещё на проверке (статус здесь тоже обновлю).
P.S. Нативно под мак пишу крайне редко, и, к сожалению, свободное время бывает редкими вечерами (и то не постоянно), поэтому интерфейс, возможно, ещё обновлю.
😃 iOS Dev — не только же про мобильную разработку.
Apple отвечает на 10 вопросов про Live Activity. Разобрал самые интересные:
- Как обновлять без пушей
- Как добавить кнопку
- Можно ли менять фон
Остальные доступны по ссылке.
Недавно евангелисты Apple, дизайнеры и инженеры (звучит как начало анекдота) собрались на конференции Ask Apple, чтобы ответить на вопросы о Live Activity и Dynamic Island.
Несколько основных моментов из этих разговоров, в том числе рекомендации по размеру, стилю и отличиях в Live Activity Иван разобрал в своём небольшом ролике:
📺 Посмотреть подробнее на канале «Код воробья».
📖 А вот тут, например, есть отличный пример работы с Live Activity.
😃 iOS Dev
Вам не (всегда) нужно использовать [weak self]
Конечно, при некорректной работе с замыканиями могут возникать ошибки.
🛠 Например, это небольшое приложение демонстрирует различные сценарии утечки памяти, а также показывает, где использование [weak self] может быть излишним.
Одна из возможных ситуаций: у вас есть дочерний контроллер, который хранит ссылку на своего владельца/родителя в свойстве. Вот тогда свойство должно быть помечено weak, чтобы предотвратить циклическую ссылку/ретэйн цикл.
📖 В этой статье рассматриваются ключевые моменты на реальных примерах.
😃 iOS Dev — некоторые материалы лучше сохранить
3 ошибки при работе с замыканиями (и как их избежать)
📖 В этом важном материале с примерами кода (и даже с видео-вставками) идёт речь о следующих ошибках:
1️⃣ Что может пойти не так при захвате переменной.
2️⃣ Retain Cycles и почему они могут появиться (куда же без них).
3️⃣ В чём разница между escaping и non-escaping (и от чего зависит время жизни замыкания).
⭐️ Кстати, рекомендую не забывать и о трёх золотых правилах weak self.
@iOS Dev
Как вернуть Jump to Definition в Xcode
Если вы предпочитаете старое поведение дефолтному (и хотите сэкономить немного времени при разработке), то можно изменить поведение Command-click.
1️⃣ Откройте Xcode Preferences.
2️⃣ Перейдите ко вкладке Navigation.
3️⃣ Измените значение с Command-click on Code на Jump to Definition.
После этого изменения вы можете открывать связанные команды с помощью command + control + click (вернуть обратно можно по этой же инструкции).
📖 Источник гифки.
@iOS Dev
Вебхуки GitHub и Xcode Cloud
Если объяснять термин простыми словами, вебхук это механизм отправки уведомлений при наступлении в системе какого-то события, на которое подписано клиентское приложение.
Подписка на события вебхука не является чем-то очень сложным, для этого необходимо создать сервер, который может обрабатывать POST-запросы и передавать URL-адрес сервера веб-сайту с вебхуком.
Мне для рабочих проектов Xcode Cloud пока что не очень зашёл, так как там невозможно прокинуть доступ на внутреннюю репу на гитлабе (без доступа по внешней сети), но несмотря на это, для репозиториев с публичным адресом это вполне хорошее решение.
📖 В этой статье рассказывается, как вы можете создать функцию Swift для прослушивания вебхука GitHubissue_comment, который запускает события каждый раз, когда пользователь добавляет комментарий к issue в репе или же пуллреквест, а также:
1️⃣ Проверяет наличие комментария в пуллреквесте.
2️⃣ Проверяет, что текст комментария соответствует строке «Upload to TestFlight».
3️⃣ Если это так, функция запускает сборку Xcode Cloud, которая загружает приложение для внутреннего тестирования в TestFlight с использованием API App Store Connect (это SDK я использую и в Starly).
@iOS Dev
Сравнительный анализ GPT-4 и GPT-3.5 на базе задач Leetcode
Состоялся релиз GPT - 4 и вышел технический репорт от OpenAI.
Прежде, чем все паблики/ленты/хабр заполнит волна очередных постов, что же там изменилось, я бы хотел акцентировать внимание на одном неваловажном сравнении, а именно том, как сейчас решает GPT-4 задачи на литкоде.
😎 Для этого я изучил отчёт, который находится в публичном доступе и собрал сравнение в отдельную таблицу.
Главный вывод, GPT-4 научился решать хард-задачи. Да, пока мягко говоря не все, но несмотря на это, прогресс от 0 к 3 огромен.
Остальные сравнительные показатели вынесены в таблицу выше.
@iOS Dev — пока ещё до скайнета далеко
Как создавать настраиваемые виджеты с динамическими параметрами?
Существует ряд обстоятельств, когда нам понадобится настраиваемый виджет с динамическими параметрами.
Среди этих ситуаций можно выделить следующие:
1️⃣ Опции предоставляются удаленным сервером (API).
2️⃣ Параметры взяты из хост-приложения виджета.
3️⃣ Опции генерируются в рантайме.
📖 В этой статье пойдёт речь о первой ситуации. И хотя руководство посвящено этому сценарию, обсуждаемые принципы и методы также могут быть применены к двум другим.
@iOS Dev
Загрузка данных в SwiftUI с помощью URLSession и async/await
Хотя загрузка данных с сервера может показаться разработчику простой, она зависит от нескольких компонентов.
Учитывая такую сложность управления, неудивительно, что URLSession является центральным узлом, который позволяет настроить каждый аспект для группировки нескольких запросов.
📖 В этом обширном материале вы сможете узнать о следующих вещах:
1️⃣ Как с помощью URLSession управлять передачей данных.
2️⃣ Моделирование данных, получаемых через URLSession.
3️⃣ Управление асинхронным процессом обновления от download task.
4️⃣ Создание пользовательского интерфейса для управления загрузкой данных.
@iOS Dev
Разбор нововведений в Swift 5.8: API с обратным развертыванием, улучшенные result builders и не только
Хотя многие важные изменения Swift в настоящее время можно узнать в Swift Evolution, Swift 5.8 сам по себе является более чистым релизом: есть не только дополнения, но также и улучшения функциональности.
📖 В этой статье Пола Хадсона можно узнать о самых важных изменениях, включающих примеры кода и пояснения.
Вам понадобится Xcode не ниже 14.3, но учтите: некоторые изменения требуют определенного флага компилятора до релиза Swift 6.
🛠 Можно заранее скачать playground, который используется в статье.
@iOS Dev
Реализация поддержки ссылок с обработкой нажатий в UILabel на SwiftUILabel поддерживает отображение строк с атрибутами ссылки, но не позволяет нажимать на них и открывать их в браузере.
Конечно, можно реализовать это на базе UITextView, но это более тяжелый компонент и, следовательно, может быть не лучшим выбором.
🛠 Однако реализация не так проста, и для этого нам потребуется собственные NSLayoutManager, NSTextStorage и NSTextContainer.
📖 В этом материале рассказывается, как создать такие ссылки с обработкой тапов.
@iOS Dev