Как избежать распространенных ошибок при переходе с UIKit на SwiftUI
Джереми Гейл опубликовал интересную статью, в которой есть мысль, что разработчики UIKit находятся в невыгодном положении по отношению к новичкам, поскольку знают способы заставить работать вещи, которые больше не актуальны в SwiftUI.
Когда я только начинал переносить некоторые проекты на SwiftUI, у меня было похожее ощущение, ведь многое доступно из коробки и так.
📖 В этой статье показан пример рефакторинга SwiftUI. Также в процесе разбираются ошибки, которые допускают разработчики, уже привыкнувшие к UIKit.
✅ О других важных подходах при разработке можно прочитать вот тут.
😃 iOS Dev
Джереми Гейл опубликовал интересную статью, в которой есть мысль, что разработчики UIKit находятся в невыгодном положении по отношению к новичкам, поскольку знают способы заставить работать вещи, которые больше не актуальны в SwiftUI.
Когда я только начинал переносить некоторые проекты на SwiftUI, у меня было похожее ощущение, ведь многое доступно из коробки и так.
📖 В этой статье показан пример рефакторинга SwiftUI. Также в процесе разбираются ошибки, которые допускают разработчики, уже привыкнувшие к UIKit.
Please open Telegram to view this post
VIEW IN TELEGRAM
Паттерн «Репозиторий» в Swift: разбор и примеры кода
🐱 Шаблон проектирования «Репозиторий» действует как промежуточный уровень между бизнес-логикой приложения и хранилищем данных.
С его помощью обеспечивается структурированный способ чтения и записи, абстрагируя при этом базовые детали уровня хранения.
При этом можно взаимодействовать с данными, не зная, хранятся ли они в памяти или где-то ещё (у нас может быть и Core Data, и Realm, и кейчейн, да хоть отдельный файл в tmp).
Это создает четкое разделение задач и значительно упрощает тестирование.
Например, мы можем юзать резервное хранилище в памяти для тестов (при использовании Core Data в проде).
Также сам уровень данных будет гораздо более гибким, поскольку появляется возможность заменить используемое хранилище данных без необходимости изменения кода приложения на уровне реализации.
Делюсь двумя вариантами применения паттерна:
📖 Шаблон с примерами кода.
📖 Core Data + Repository pattern. Детали реализации.
🍏 А на бусти можно познакомиться с двумя большими разделами по паттернам:
🔗 Структурные паттерны проектирования.
🔗 Порождающие паттерны проектирования (с примерами на Swift).
😃 iOS Dev
С его помощью обеспечивается структурированный способ чтения и записи, абстрагируя при этом базовые детали уровня хранения.
При этом можно взаимодействовать с данными, не зная, хранятся ли они в памяти или где-то ещё (у нас может быть и Core Data, и Realm, и кейчейн, да хоть отдельный файл в tmp).
Это создает четкое разделение задач и значительно упрощает тестирование.
Например, мы можем юзать резервное хранилище в памяти для тестов (при использовании Core Data в проде).
Также сам уровень данных будет гораздо более гибким, поскольку появляется возможность заменить используемое хранилище данных без необходимости изменения кода приложения на уровне реализации.
Делюсь двумя вариантами применения паттерна:
📖 Шаблон с примерами кода.
📖 Core Data + Repository pattern. Детали реализации.
Please open Telegram to view this post
VIEW IN TELEGRAM
Реализация навигации в SwiftUI с помощью NavigationPath и NavigationDestination
🗺 Вообще, одной из основных проблем в SwiftUI была как раз навигация.
До появления NavigationPath существовали некоторые способы решения этой проблемы, но не слишком удобные.
📖 В этом посте рассматриваются особенности NavigationPath (доступной с iOS 16), принципы работы и отличия от UINavigationController в UIKit.
⌚ Некоторое время назад я обновлял таргет для Apple Watch в одном из своих приложений, как раз применяя это сочетание.
😃 iOS Dev
До появления NavigationPath существовали некоторые способы решения этой проблемы, но не слишком удобные.
📖 В этом посте рассматриваются особенности NavigationPath (доступной с iOS 16), принципы работы и отличия от UINavigationController в UIKit.
⌚ Некоторое время назад я обновлял таргет для Apple Watch в одном из своих приложений, как раз применяя это сочетание.
Please open Telegram to view this post
VIEW IN TELEGRAM
🎉 У меня День Рождения
[-Onone]
Быть профессионалом, безусловно, важно. Желание, а вместе с ним и стремление смотреть вглубь — необходимое качество не только на нашей работе, но и в жизни.
Без оптимизации источников за кажущейся ширмой лёгкого контента часто скрываются киллеры времени.
[-Osize]
В нашем канале я продолжаю делать акцент на технической составляющей, а не на видео из тик-тока или других филлерах личного пространства.
В первую очередь, я разработчик, и только затем — автор канала. Я не распыляюсь на суждения о других блогах и едва ли употребляю слово "самый" чаще, чем это необходимо по причине контрпродуктивности. Нужна ли агрессивная оптимизация?
[-O]
Иногда приоритет нужно отдать производительности вместо общения в чате. Это может быть непростым выбором, но на дистанции это принесёт свои результаты.
🐾 Спасибо вам за вашу оценку постов, комментарии и за то, что вы здесь.
⬇️ One more thing (in progress...).
[-Onone]
Быть профессионалом, безусловно, важно. Желание, а вместе с ним и стремление смотреть вглубь — необходимое качество не только на нашей работе, но и в жизни.
Без оптимизации источников за кажущейся ширмой лёгкого контента часто скрываются киллеры времени.
[-Osize]
В нашем канале я продолжаю делать акцент на технической составляющей, а не на видео из тик-тока или других филлерах личного пространства.
В первую очередь, я разработчик, и только затем — автор канала. Я не распыляюсь на суждения о других блогах и едва ли употребляю слово "самый" чаще, чем это необходимо по причине контрпродуктивности. Нужна ли агрессивная оптимизация?
[-O]
Иногда приоритет нужно отдать производительности вместо общения в чате. Это может быть непростым выбором, но на дистанции это принесёт свои результаты.
Please open Telegram to view this post
VIEW IN TELEGRAM
iOS Dev
🎉 У меня День Рождения [-Onone] Быть профессионалом, безусловно, важно. Желание, а вместе с ним и стремление смотреть вглубь — необходимое качество не только на нашей работе, но и в жизни. Без оптимизации источников за кажущейся ширмой лёгкого контента…
Please open Telegram to view this post
VIEW IN TELEGRAM
Почему загрузка пакетов с помощью Swift Package Manager занимает слишком много времени?
Когда мы добавляем зависимость в проект через spm, он извлекает весь репозиторий пакета со всеми ветками и полную историю git, которая может представлять собой годы git-снапшотов.
Суть проблемы тут.
Но почему?
На вопрос ответил инженер по инфраструктуре GitHub (обратите внимание на дату комментария), схожая проблема была и в Cocoapods:
Поверхностное клонирование по какой-то причине обходится намного дороже, чем клонирование всего репозитория. К тому же GitHub ограничивает скорость в таких репах, что приводит к значительному увеличению времени.
Хуже того, фетч может вообще завершиться ошибкой по таймауту.
Так в чем же заключается решение?
Очевидно, многие компании используют такой подход. Они создают отдельный реп с предварительно скомпилированным .xcframework, при этом пользователь получит только нужную часть исходного репозитория.
Например airbnb/lottie применила этот подход и уменьшила размер своего репозитория с +300 МБ до менее 500 КБ!
Signal сделал то же самое: отсюда OneSignal-iOS-SDK пришли к оптимизированной версии OneSignal-XCFramework.
📖 Про другой интересный кейс можно прочитать на хабре.
😃 iOS Dev
Когда мы добавляем зависимость в проект через spm, он извлекает весь репозиторий пакета со всеми ветками и полную историю git, которая может представлять собой годы git-снапшотов.
Суть проблемы тут.
Но почему?
На вопрос ответил инженер по инфраструктуре GitHub (обратите внимание на дату комментария), схожая проблема была и в Cocoapods:
Поверхностное клонирование по какой-то причине обходится намного дороже, чем клонирование всего репозитория. К тому же GitHub ограничивает скорость в таких репах, что приводит к значительному увеличению времени.
Хуже того, фетч может вообще завершиться ошибкой по таймауту.
Так в чем же заключается решение?
Очевидно, многие компании используют такой подход. Они создают отдельный реп с предварительно скомпилированным .xcframework, при этом пользователь получит только нужную часть исходного репозитория.
Например airbnb/lottie применила этот подход и уменьшила размер своего репозитория с +300 МБ до менее 500 КБ!
Signal сделал то же самое: отсюда OneSignal-iOS-SDK пришли к оптимизированной версии OneSignal-XCFramework.
📖 Про другой интересный кейс можно прочитать на хабре.
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Что означает spacing = nil в SwiftUI?
Понимание принципов Spacing важно при работе со сложной версткой, а владение определенными техниками может помочь добиться эффектов, которые сложно реализовать традиционными методами.
Как можно видеть на гифке, когда используется nil, расстояние между Text и соседними элементами больше не равны.
Из документации Apple:
При установке nil расстояние должно быть дефолтным по умолчанию для каждой пары subviews.
Но, как оказывается, это значение не фиксировано.
📖 В этой статье объясняется, что на самом деле означает значение nil по умолчанию для параметра Spacing.
Кроме того, рассматриваются и другие аспекты, связанные с этим свойством.
😃 iOS Dev
Понимание принципов Spacing важно при работе со сложной версткой, а владение определенными техниками может помочь добиться эффектов, которые сложно реализовать традиционными методами.
Как можно видеть на гифке, когда используется nil, расстояние между Text и соседними элементами больше не равны.
Из документации Apple:
При установке nil расстояние должно быть дефолтным по умолчанию для каждой пары subviews.
Но, как оказывается, это значение не фиксировано.
📖 В этой статье объясняется, что на самом деле означает значение nil по умолчанию для параметра Spacing.
Кроме того, рассматриваются и другие аспекты, связанные с этим свойством.
Please open Telegram to view this post
VIEW IN TELEGRAM
Подготовка к собеседованиям: Swift Concurrency
Подготовил вопросы, которые помогут новичкам и опытным разработчикам, знакомым с концепциями параллелизма и заинтересованным в изучении синтаксиса и API Swift Concurrency.
Можно узнать что-то новое о приоритетах, выполнении нескольких задач одновременно и многом другом. Задачи постарался по максимуму покрыть примерами с кодом. Некоторые из вопросов уже добавлены в приложение.
✅ Доступ можно получить здесь или тут сразу на год.
Больше важных тем:
🔗 Блок вопросов: многопоточность (и бонус)
🔗 Собеседования: вопросы на понимание кода
🔗 DispatchQueue: практические вопросы
😃 iOS Dev
Подготовил вопросы, которые помогут новичкам и опытным разработчикам, знакомым с концепциями параллелизма и заинтересованным в изучении синтаксиса и API Swift Concurrency.
Можно узнать что-то новое о приоритетах, выполнении нескольких задач одновременно и многом другом. Задачи постарался по максимуму покрыть примерами с кодом. Некоторые из вопросов уже добавлены в приложение.
Больше важных тем:
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Как сделать иконку приложения анимированной?
Наверняка, многие могли задуматься и раньше, как избежать алерта при выборе альтернативной иконки.
Bryce Bostwick, разработчик, знакомый по великолепным постам о реверс-инжиниринге, попробовал покопать глубже, и написал большое исследование о том, как создать иллюзию анимации (на самом деле для этого нужно достаточно часто менять эти иконки).
📖 Почитать увлекательную статью можно здесь (и рекомендую посмотреть остальные статьи блога).
📺 В формате видео вот тут.
🛠 Демо-проект (посмотреть и попробовать повторить) доступен на github. Напоминаю про этот пост, если захотите выложить в стор.
✅ Больше крутых эффектов можно увидеть здесь или тут.
😃 iOS Dev
Наверняка, многие могли задуматься и раньше, как избежать алерта при выборе альтернативной иконки.
Bryce Bostwick, разработчик, знакомый по великолепным постам о реверс-инжиниринге, попробовал покопать глубже, и написал большое исследование о том, как создать иллюзию анимации (на самом деле для этого нужно достаточно часто менять эти иконки).
📖 Почитать увлекательную статью можно здесь (и рекомендую посмотреть остальные статьи блога).
📺 В формате видео вот тут.
🛠 Демо-проект (посмотреть и попробовать повторить) доступен на github. Напоминаю про этот пост, если захотите выложить в стор.
Please open Telegram to view this post
VIEW IN TELEGRAM
Объяснение использования
Если включить -strict-concurrency для своих существующих проектов, то, вероятнее всего, при первой компиляции проекта Xcode выдаст множество предупреждений и/или ошибок.
Этого можно избежать с использованием @preconcurrency, можно использовать для:
📼 functions
📼 types
📼 protocols
📼 imports
С помощью
Это отличный способ начать постепенно внедрять строгий параллелизм по мере приближения выпуска Swift 6.
📖 В этом посте рассмотрены примеры использования и ошибки, которые могут встретиться.
😃 iOS Dev
@preconcurrency
в SwiftЕсли включить -strict-concurrency для своих существующих проектов, то, вероятнее всего, при первой компиляции проекта Xcode выдаст множество предупреждений и/или ошибок.
Этого можно избежать с использованием @preconcurrency, можно использовать для:
С помощью
@preconcurrency
появляется возможность импортировать старые модули в новый код. Это отличный способ начать постепенно внедрять строгий параллелизм по мере приближения выпуска Swift 6.
📖 В этом посте рассмотрены примеры использования и ошибки, которые могут встретиться.
Please open Telegram to view this post
VIEW IN TELEGRAM
Настраиваемая кнопка с разными состояниями в SwiftUI
Конечно, задача мобильных разработчиков далеко не только в покраске кнопок, но знать несколько подходов и обладать арсеналом таких навыков необходимо.
SwiftUI в несколько раз упрощает создание переиспользуемой кнопки (и добавление конфигов).
📖 Вот тут можно увидеть подходы к созданию такого элемента на реальных примерах.
😃 iOS Dev
Конечно, задача мобильных разработчиков далеко не только в покраске кнопок, но знать несколько подходов и обладать арсеналом таких навыков необходимо.
SwiftUI в несколько раз упрощает создание переиспользуемой кнопки (и добавление конфигов).
📖 Вот тут можно увидеть подходы к созданию такого элемента на реальных примерах.
Please open Telegram to view this post
VIEW IN TELEGRAM
iOS Dev
Какие темы обязательно должны быть в первой версии?
Anonymous Poll
61%
Многопоточность
43%
Память
29%
Алгоритмы (сложность, примеры)
44%
Архитектуры
30%
Код (поиск ошибок и т.д.)
33%
Компилятор (особенности, оптимизации, терминология)
Протоколы в iOS: назначение и примеры
Даже при частом использовании протоколов начинающие разработчики могут не знать все особенности.
Например,
📖 В этой статье разбираются популярные протоколы на примерах кода.
🧠 Ах да, кстати, приложение уже в тестфлайте и вы можете получить ранний доступ.
Кстати, проголосовавшие в опросе будут приятно удивлены списку тем внутри.
😃 iOS Dev
Даже при частом использовании протоколов начинающие разработчики могут не знать все особенности.
Например,
Identifiable
постоянно нужен в SwiftUI, но почему он обычно применяется для списков? Или CustomStringConvertible
, который вполне подойдёт для более удобного дебага наших моделей.📖 В этой статье разбираются популярные протоколы на примерах кода.
Кстати, проголосовавшие в опросе будут приятно удивлены списку тем внутри.
Please open Telegram to view this post
VIEW IN TELEGRAM
The Composable Architecture: часто задаваемые вопросы
Создатели компонуемой архитектуры (или же TCA) собрали ответы на часто задаваемые вопросы, и развеяли несколько мифов (в том числе и о минусах):
🔗 Следует ли использовать TCA для всех типов приложений?
🔗 Идет ли TCA вразрез со SwiftUI?
🔗 Не является ли ведение отдельного перечисления «действий» лишней работой?
🔗 Являются ли функции TCA неэффективными, потому что все состояние приложения хранится в одном массивном типе?
🔗 Нужно ли быть знакомым с «функциональным программированием», чтобы использовать TCA?
📖 Другие (не менее важные) вопросы создатели архитектуры также рассмотрели в своём блоге.
✅ Узнать больше про архитектуры можно в этом посте.
😃 iOS Dev
Создатели компонуемой архитектуры (или же TCA) собрали ответы на часто задаваемые вопросы, и развеяли несколько мифов (в том числе и о минусах):
📖 Другие (не менее важные) вопросы создатели архитектуры также рассмотрели в своём блоге.
Please open Telegram to view this post
VIEW IN TELEGRAM
Вопрос из приложения iOS IQ
🐱 Попробуйте догадаться, какая временная сложность у алгоритма для решения задачи «Ханойские башни».
Это пример из приложения, доступного на бусти (кстати, есть хардкор-режим для настоящих профессионалов).
✅ Уже сейчас можно попробовать возглавить таблицу лидеров.
😃 iOS Dev
Это пример из приложения, доступного на бусти (кстати, есть хардкор-режим для настоящих профессионалов).
Please open Telegram to view this post
VIEW IN TELEGRAM
Как справиться с секцией на написание кода?
Чтобы оценить кандидата, компании используют одну, либо сразу две итерации:
1️⃣ Лайв-кодинг. Нужно решить техническую задачу перед интервьюерами (от 0.5 до 1.5 часов).
2️⃣ Тестовое задание. Чаще всего на срок от одного-двух дней (иногда неделя).
📖 Вот тут можно ознакомиться с некоторыми полезными советами про прохождению этой секции. Среди них:
🔘 Прочтите условие несколько раз. Как известно в условии вопроса часто половина решения (особенно касается лайв-кодинга).
🔘 Разделите техническую задачу на следующие темы: обязательные требования и дополнительные требования.
🔘 Выпишите вопросы. Уточните их у интервьюера.
🔘 Убедитесь, можно ли юзать сторонние либы перед тем, как их добавлять.
При подготовке также важно определиться, какой именно архитектурный паттерн вам нужен.
✅ Другие советы и задачи можно найти вот тут.
😃 iOS Dev
Чтобы оценить кандидата, компании используют одну, либо сразу две итерации:
1️⃣ Лайв-кодинг. Нужно решить техническую задачу перед интервьюерами (от 0.5 до 1.5 часов).
2️⃣ Тестовое задание. Чаще всего на срок от одного-двух дней (иногда неделя).
📖 Вот тут можно ознакомиться с некоторыми полезными советами про прохождению этой секции. Среди них:
🔘 Прочтите условие несколько раз. Как известно в условии вопроса часто половина решения (особенно касается лайв-кодинга).
🔘 Разделите техническую задачу на следующие темы: обязательные требования и дополнительные требования.
🔘 Выпишите вопросы. Уточните их у интервьюера.
🔘 Убедитесь, можно ли юзать сторонние либы перед тем, как их добавлять.
При подготовке также важно определиться, какой именно архитектурный паттерн вам нужен.
Please open Telegram to view this post
VIEW IN TELEGRAM
Алгоритмы: терминология и примеры
Для того, чтобы понять сложность алгоритма, иногда достаточно просто использовать свою интуицию (не нужно слишком глубоких математических знаний).
Например, если код использует один цикл, в котором мы проходим по всем n элементов входных данных, сложность O(n).
Если у нас есть два вложенных цикла, это O(n^2), и так далее.
📖 Конечно, в канале уже был пост про сложность алгоритмов.
Но бывают и далеко не самые очевидные моменты.
🧠 Пришло время новой секции в iOS IQ (добавлено две части, на теорию и на оценку кода). Есть и интерактивный формат в тестфлайте.
❤️ Получить доступ можно сразу на год.
🐱 А в честь WWDC со скидкой 24% - вот тут (ссылка работает ровно неделю).
😃 iOS IQ
Для того, чтобы понять сложность алгоритма, иногда достаточно просто использовать свою интуицию (не нужно слишком глубоких математических знаний).
Например, если код использует один цикл, в котором мы проходим по всем n элементов входных данных, сложность O(n).
Если у нас есть два вложенных цикла, это O(n^2), и так далее.
📖 Конечно, в канале уже был пост про сложность алгоритмов.
Но бывают и далеко не самые очевидные моменты.
Please open Telegram to view this post
VIEW IN TELEGRAM
Начали с показа обновлений Vision OS 2
Из крутых фич, теперь технологии позволят создавать из 2D фото с погружением.
Пообещали упростить работу с технологиями, добавили новые API. Volumetric APIs, TabletopKit, Enterprise APIs.
Добавили 8 новых стран, где можно купить.
😃 iOS Dev
Из крутых фич, теперь технологии позволят создавать из 2D фото с погружением.
Пообещали упростить работу с технологиями, добавили новые API. Volumetric APIs, TabletopKit, Enterprise APIs.
Добавили 8 новых стран, где можно купить.
Please open Telegram to view this post
VIEW IN TELEGRAM
iOS 18
Расширили работу с иконками на домашнем экране (в андроиде уже тысячу лет?).
😎 Иконки можно красить, привет, tintColor!
😃 iOS Dev
Расширили работу с иконками на домашнем экране (в андроиде уже тысячу лет?).
Please open Telegram to view this post
VIEW IN TELEGRAM
Control Center
Пересмотрели функциональность. Можно добавлять виджеты, появилась возможность задавать новые элементы для своих приложений.
Для этого появится новый Control API.
😃 iOS Dev
Пересмотрели функциональность. Можно добавлять виджеты, появилась возможность задавать новые элементы для своих приложений.
Для этого появится новый Control API.
Please open Telegram to view this post
VIEW IN TELEGRAM