Xcode поставляется со своей версией Swift, и мы всегда можем обратиться к этому списку. Иногда бывает ситуация, когда обновлять Swift для своего проекта не лучший вариант в текущий момент. Для более старой версии Swift, можно сделать следующее:
1️⃣ Проверьте версию Swift:
2️⃣ Узнайте местонахождение:
3️⃣ Установите альтернативный набор инструментов Swift, если требуется:
— На этом ресурсе можно скачать нужный вариант. Установите его, он будет располагаться тут:
— Проверьте идентификатор:
Например,
— С идентификатором теперь можно выбирать, какой нужен набор инструментов:
Как альтернатива, можно создать переменную окружения:
Для проверки, что всё ок, используйте 1️⃣ и 2️⃣ шаги.
@iOS Dev
1️⃣ Проверьте версию Swift:
xcrun swift --version
2️⃣ Узнайте местонахождение:
xcrun -f swift
3️⃣ Установите альтернативный набор инструментов Swift, если требуется:
— На этом ресурсе можно скачать нужный вариант. Установите его, он будет располагаться тут:
/Library/Developer/Toolchains
— Проверьте идентификатор:
cat /Library/Developer/Toolchains/swift-5.5-RELEASE.xctoolchain/Info.plist
Например,
CFBundleIdentifier
для org.swift.550202109201a
— С идентификатором теперь можно выбирать, какой нужен набор инструментов:
xcodebuild -toolchain org.swift.550202109201a
xcrun -toolchain org.swift.550202109201a
Как альтернатива, можно создать переменную окружения:
export TOOLCHAINS=org.swift.550202109201a
Для проверки, что всё ок, используйте 1️⃣ и 2️⃣ шаги.
@iOS Dev
Туториал для начинаюших по Bezier Paths и Shape Layers
Существуют разные способы и разные подходы к тому, как нарисовать "экран" приложения:
— Использовать полученную графику от дизайнеров.
— Реализовать UI в коде.
— Использовать Interface Builder.
— Комбинации способов выше и другие варианты.
🛠Однако иногда компоненты нужно создать программно, и тогда могут возникнуть сложности.
ℹ️ Этих проблем можно избежать, используя класс
📖 В этой статье предлагается практическое руководство по созданию Bezier Paths. Автор рассматривает серию небольших, но понятных примеров, и знакомит нас с обеими концепциями.
😉 Как говорится, от простого к сложному, шаг за шагом!
@iOS Dev
Существуют разные способы и разные подходы к тому, как нарисовать "экран" приложения:
— Использовать полученную графику от дизайнеров.
— Реализовать UI в коде.
— Использовать Interface Builder.
— Комбинации способов выше и другие варианты.
🛠Однако иногда компоненты нужно создать программно, и тогда могут возникнуть сложности.
ℹ️ Этих проблем можно избежать, используя класс
UIBezierPath
, который необходим для создания векторных контуров. С его помощью можно создавать и простые фигуры, например прямоугольники, квадраты, овалы и круги, и очень сложные, добавляя прямые и изогнутые линии для набора точек.📖 В этой статье предлагается практическое руководство по созданию Bezier Paths. Автор рассматривает серию небольших, но понятных примеров, и знакомит нас с обеими концепциями.
😉 Как говорится, от простого к сложному, шаг за шагом!
@iOS Dev
Как повысить энергоэффективность приложения, если у вас много таймеров, но не все они критичны?
Добавление порога допуска таймера — это простой способ снизить его энергопотребление. Это позволяет задать некоторую свободу действий для системы при выполнении таймера в случаях, если вы можете сказать:
"Я бы хотел, чтобы это выполнялось раз в секунду, но если это произойдет на 200 миллисекунд позже, то в целом тоже норм".
🧐 Это позволяет системе выполнять timer coalescing (если попроще, то что-то вроде объединения), когда несколько событий таймера собираются вместе для экономии заряда батареи.
Например, если вы просите запустить таймер через 1 секунду с допуском 0,5 секунды, он может быть запущен через 1 секунду, 1,5 секунды, 1,3 секунды и так далее.
При этом таймер никогда не будет запущен раньше — допуск добавляет время после запрошенной даты выполнения.
🛠 Пример кода создает таймер, который будет запускаться с допуском в 0,2 сек.
@iOS Dev
Добавление порога допуска таймера — это простой способ снизить его энергопотребление. Это позволяет задать некоторую свободу действий для системы при выполнении таймера в случаях, если вы можете сказать:
"Я бы хотел, чтобы это выполнялось раз в секунду, но если это произойдет на 200 миллисекунд позже, то в целом тоже норм".
🧐 Это позволяет системе выполнять timer coalescing (если попроще, то что-то вроде объединения), когда несколько событий таймера собираются вместе для экономии заряда батареи.
Например, если вы просите запустить таймер через 1 секунду с допуском 0,5 секунды, он может быть запущен через 1 секунду, 1,5 секунды, 1,3 секунды и так далее.
При этом таймер никогда не будет запущен раньше — допуск добавляет время после запрошенной даты выполнения.
🛠 Пример кода создает таймер, который будет запускаться с допуском в 0,2 сек.
@iOS Dev
Бинго для WWDC 2022 6 июня
📺 Осталась неделя до Worldwide Developers Conference (она же даб-даб ди си, она же даб-даб).
В интернете на сегодняшний день собралось довольно много слухов и рациональных предположений.
😎 А чтобы наблюдать за событием 6 июня было интереснее, я сделал бинго с тем, что мы можем услышать или увидеть. Предлагаю его вашему вниманию.
📔 Сохраните себе, вдруг пригодится!
@iOS Dev
📺 Осталась неделя до Worldwide Developers Conference (она же даб-даб ди си, она же даб-даб).
В интернете на сегодняшний день собралось довольно много слухов и рациональных предположений.
😎 А чтобы наблюдать за событием 6 июня было интереснее, я сделал бинго с тем, что мы можем услышать или увидеть. Предлагаю его вашему вниманию.
📔 Сохраните себе, вдруг пригодится!
@iOS Dev
Перебор элементов и индексов в коллекциях Swift
🤔Автор считает, что
Интовое значение через
🧑💻 Для перебора элементов и индексов можно использовать функцию
Можем отказаться от
📖 Кстати! В этой статье можно почитать, как использовать zip для объединения двух массивов.
@iOS Dev
🤔Автор считает, что
enumerated()
для получения элементов и индексов не самый правильный способ и предлагает альтернативу.Интовое значение через
enumerated()
не должно использоваться в качестве индекса, если только коллекция не zero-based и не индексирована целыми числами. Это счетчик, который всегда начинается с нуля.🧑💻 Для перебора элементов и индексов можно использовать функцию
zip()
.// Array<String>
var ingredients = ["potatoes", "cheese", "cream"]
// Array<String>.SubSequence
var doubleIngredients = ingredients.dropFirst()
for (i, ingredient) in zip(
doubleIngredients.indices, doubleIngredients
) {
// do something with the index
doubleIngredients[i] = "\(ingredient) x 2"
}
Можем отказаться от
enumerated()
и считать элементы с помощью функции zip()
. Это можно использовать для продвинутого контроля, начинаем ли считать с 0 или с 1.📖 Кстати! В этой статье можно почитать, как использовать zip для объединения двух массивов.
@iOS Dev
Повышаем рейтинг приложений с помощью SKStoreReviewController 💪
📖 В статье автор напоминает правила для показа системного алерта:
— Запрос на оценку будет показан пользователю не более трех раз в течение 365 дней.
— Невозможно узнать, появился ли запрос на оценку.
— Мы не узнаем выбор пользователя (нажал или скипнул).
💡Это, конечно, неприятно. Но вместе с тем рассматривается важность подобных оценок и отзывов, и приводится один из примеров нужных таймингов:
— Просим оценить только тех, кто установил приложение более 7 дней назад.
— Запрашивайте оценку 1 раз для каждой версии.
— У пользователя должно быть минимальное количество сессий.
— Нужно определить, что пользователь попробовал целевые функции перед оценкой.
Кроме этого, автор показывает пример нужного конфига.
🛠 И не забывает напомнить нам, что для отзыва пользователь может и перейти по ссылке:
Здесь XXXXXXXXXX — айди нашего приложения в сторе.
@iOS Dev
📖 В статье автор напоминает правила для показа системного алерта:
— Запрос на оценку будет показан пользователю не более трех раз в течение 365 дней.
— Невозможно узнать, появился ли запрос на оценку.
— Мы не узнаем выбор пользователя (нажал или скипнул).
💡Это, конечно, неприятно. Но вместе с тем рассматривается важность подобных оценок и отзывов, и приводится один из примеров нужных таймингов:
— Просим оценить только тех, кто установил приложение более 7 дней назад.
— Запрашивайте оценку 1 раз для каждой версии.
— У пользователя должно быть минимальное количество сессий.
— Нужно определить, что пользователь попробовал целевые функции перед оценкой.
Кроме этого, автор показывает пример нужного конфига.
🛠 И не забывает напомнить нам, что для отзыва пользователь может и перейти по ссылке:
"https://apps.apple.com/app/idXXXXXXXXXX?action=write-review"
Здесь XXXXXXXXXX — айди нашего приложения в сторе.
@iOS Dev
Apple продолжает подготовку к WWDC, которая должна начаться в понедельник
💻 Cегодня компания запустила прямую трансляцию на YouTube, где зрители могут зарегистрироваться, чтобы получить напоминание о начале мероприятия.
🌐 Стрим также можно будет найти на этой странице.
🗓 Напоминаю дату начала: 6 июня, в 20:00 по московскому времени.
💻 Cегодня компания запустила прямую трансляцию на YouTube, где зрители могут зарегистрироваться, чтобы получить напоминание о начале мероприятия.
🌐 Стрим также можно будет найти на этой странице.
🗓 Напоминаю дату начала: 6 июня, в 20:00 по московскому времени.
Открыта запись в Digital Lounges!
🤩 Кроме анонса WWDC, компания Apple открыла регистрацию в Digital Lounges.
Они предназначены для того, чтобы разработчики могли напрямую общаться с инженерами и дизайнерами Apple для получения рекомендаций.
✍️ Участники программы Apple Developer Program и победители конкурса Swift Student Challenge 2022 могут зарегистрироваться в Digital Lounges на сайте WWDC или в приложении Apple Developer.
🤩 Кроме анонса WWDC, компания Apple открыла регистрацию в Digital Lounges.
Они предназначены для того, чтобы разработчики могли напрямую общаться с инженерами и дизайнерами Apple для получения рекомендаций.
✍️ Участники программы Apple Developer Program и победители конкурса Swift Student Challenge 2022 могут зарегистрироваться в Digital Lounges на сайте WWDC или в приложении Apple Developer.
This media is not supported in your browser
VIEW IN TELEGRAM
Пример создания приложения Todo list для iOS с использованием VIPER
🤔 Решение о том, какую архитектуру приложения использовать при создании iOS-приложения, является одной из самых сложных задач.
Существует множество архитектур на выбор: MVC, MVVM, MVP, View State, VIPER и многие другие.
Архитектура, которую мы выберем, будет определять, как будет построено программное обеспечение и как оно будет масштабироваться по мере роста.
📖 Одной из архитектур, о которой идёт речь в этой статье, является архитектура VIPER.
VIPER разделяет структуру приложения на компоненты внутри модуля/экрана с принципом единой ответственности.
Благодаря этому приложение становится более модульным и менее связанным с другими компонентами.
👌 Юнит-тестирование и интеграционное тестирование становятся намного проще из-за границ (протокол/интерфейс) между каждым компонентом.
🛠 Вот тут доступен код приложения, если вы предпочитаете сразу перейти к самому интересному.
@iOS Dev
🤔 Решение о том, какую архитектуру приложения использовать при создании iOS-приложения, является одной из самых сложных задач.
Существует множество архитектур на выбор: MVC, MVVM, MVP, View State, VIPER и многие другие.
Архитектура, которую мы выберем, будет определять, как будет построено программное обеспечение и как оно будет масштабироваться по мере роста.
📖 Одной из архитектур, о которой идёт речь в этой статье, является архитектура VIPER.
VIPER разделяет структуру приложения на компоненты внутри модуля/экрана с принципом единой ответственности.
Благодаря этому приложение становится более модульным и менее связанным с другими компонентами.
👌 Юнит-тестирование и интеграционное тестирование становятся намного проще из-за границ (протокол/интерфейс) между каждым компонентом.
🛠 Вот тут доступен код приложения, если вы предпочитаете сразу перейти к самому интересному.
@iOS Dev
Генерация собственного QR-кода (и не только) в Swift
📖 Давайте посмотрим, как мы можем использовать Swift для создания различных типов штрихкодов и QR-кодов.
Вам не нужны сторонние библиотеки, которые могли бы поддерживать эту функциональность, ведь вы можете создавать самые разные типы QR и штрих-кодов сами, используя родной Swift 😉.
В рамках этого туториала приводятся примеры генерации для:
1️⃣ Aztec Barcode.
2️⃣ QRCode.
3️⃣ PDF417.
4️⃣ Code128.
@iOS Dev
📖 Давайте посмотрим, как мы можем использовать Swift для создания различных типов штрихкодов и QR-кодов.
Вам не нужны сторонние библиотеки, которые могли бы поддерживать эту функциональность, ведь вы можете создавать самые разные типы QR и штрих-кодов сами, используя родной Swift 😉.
В рамках этого туториала приводятся примеры генерации для:
1️⃣ Aztec Barcode.
2️⃣ QRCode.
3️⃣ PDF417.
4️⃣ Code128.
@iOS Dev
This media is not supported in your browser
VIEW IN TELEGRAM
Как симулировать изменение местоположения в реальном времени с помощью Xcode?
😎Автор этого туториала работал в Porsche, а большую часть своего времени посвящал работе над новым навигационным SDK.
Для успешной разработки SDK нужен был способ имитации изменения местоположения пользователя. В частности, в компании хотели оценить производительность различных навигационных алгоритмов, тестируя их на одном и том же наборе обновлений местоположения.
💻 К счастью, мы можем легко воспроизвести обновления местоположения, используя файлы
ℹ️ Кстати! Если захотите сделать собственный кастомный путь, то можно воспользоваться этим сайтом.
@iOS Dev
😎Автор этого туториала работал в Porsche, а большую часть своего времени посвящал работе над новым навигационным SDK.
Для успешной разработки SDK нужен был способ имитации изменения местоположения пользователя. В частности, в компании хотели оценить производительность различных навигационных алгоритмов, тестируя их на одном и том же наборе обновлений местоположения.
💻 К счастью, мы можем легко воспроизвести обновления местоположения, используя файлы
.gpx
в Xcode. Файл .gpx
, по сути, представляет собой отображение точек GPS во времени, а указание метки времени для каждой GPS-координаты позволяет имитировать ходьбу, езду на велосипеде или вождение автомобиля по шоссе.ℹ️ Кстати! Если захотите сделать собственный кастомный путь, то можно воспользоваться этим сайтом.
@iOS Dev
Почисти Derived Data
🤔 Часто слышали/говорили эту фразу?
Удаление Derived Data — известный способ, о котором мы вспоминаем, когда Xcode ведет себя странно.
📖 Автор статьи до сих пор помнит, как ему в первый раз рассказали об этом трюке. И хотя DerivedData может меняться с каждой версией Xcode, почему бы не уделить пару минут и не почитать, что там внутри?
Я решил пойти дальше, и посмотреть, к чему приводит игнорирование особенностей DerivedData.
Здесь рассказывается о сложностях при работе с Jenkins CI server, запущенным как Launch Daemon.
Практический совет на будущее — регулярно чистить DerivedData Xcode на CI-сервере.
📺 Хотите копнуть глубже? Есть годное видео с WWDC 2018, которое объясняет, что происходит за кулисами в процессе сборки.
@iOS Dev
🤔 Часто слышали/говорили эту фразу?
Удаление Derived Data — известный способ, о котором мы вспоминаем, когда Xcode ведет себя странно.
📖 Автор статьи до сих пор помнит, как ему в первый раз рассказали об этом трюке. И хотя DerivedData может меняться с каждой версией Xcode, почему бы не уделить пару минут и не почитать, что там внутри?
Я решил пойти дальше, и посмотреть, к чему приводит игнорирование особенностей DerivedData.
Здесь рассказывается о сложностях при работе с Jenkins CI server, запущенным как Launch Daemon.
Практический совет на будущее — регулярно чистить DerivedData Xcode на CI-сервере.
📺 Хотите копнуть глубже? Есть годное видео с WWDC 2018, которое объясняет, что происходит за кулисами в процессе сборки.
@iOS Dev
Генерация кода запроса с помощью Postman за 10 секунд
😎 Уверен, что многие разработчики использовали Postman для тестирования своих запросов, да и вообще для проверки того, что API работает. Так вот, знали ли вы о возможности генерить код запроса, в том числе для Swift, прямо из приложения?
🛠 Если вам лень, то вы можете нажать на кнопку Code, и в выпадающем списке выбрать нужный язык, в нашем случае — Swift.
@iOS Dev
😎 Уверен, что многие разработчики использовали Postman для тестирования своих запросов, да и вообще для проверки того, что API работает. Так вот, знали ли вы о возможности генерить код запроса, в том числе для Swift, прямо из приложения?
🛠 Если вам лень, то вы можете нажать на кнопку Code, и в выпадающем списке выбрать нужный язык, в нашем случае — Swift.
@iOS Dev
Туториал по custom transitions в iOS. Прокачиваем стандартные push, pop и modal
📖 В этом руководстве вы узнаете, как заменить push, pop и modal анимации пользовательскими переходами.
🛠Примеры кода находится в репозитории, в нем вы найдете возможности замены стандартных анимаций навигации push & pop на собственные.
Также автор реализовал кастомную модальную анимацию, в которой используются интерактивные переходы.
😉 Очевидно, что есть много разных возможностей, но в этой статье даётся понимание, с чего начать.
@iOS Dev
📖 В этом руководстве вы узнаете, как заменить push, pop и modal анимации пользовательскими переходами.
🛠Примеры кода находится в репозитории, в нем вы найдете возможности замены стандартных анимаций навигации push & pop на собственные.
Также автор реализовал кастомную модальную анимацию, в которой используются интерактивные переходы.
😉 Очевидно, что есть много разных возможностей, но в этой статье даётся понимание, с чего начать.
@iOS Dev
Полное руководство по архитектуре VIPER
📖 В материале с таким названием предлагается узнать, как писать масштабируемый код с использованием VIPER и некоторыми приемами из других архитектур.
Я согласен с автором по многим пунктам.
🧐 Во-первых, НЕ стоит думать, что VIPER — это плохо потому, что кто-то неправильно им воспользовался. MVP хорош для приложения с небольшим объёмом экранов, и я согласен с тем, что не следует использовать VIPER для таких приложений.
🤔 Проблемы могут начаться, когда в приложение попадает все больше компонентов. И вот тут стоит задуматься, а точно ли всё хорошо?
Если в ваших планах небольшое приложение, можно начать с MVC. Позже можно решить проблему массивных контроллеров с помощью MVVM, также подойдет MVP или паттерн координатора.
Автор заверяет, что плохой архитектуры не бывает. Есть плохой выбор, который приводит нас к сложной кодовой базе.
🛠Чтобы писать по-настоящему масштабируемые приложения, можно познакомиться с VIPER с конструктором модулей = VIPER(B).
@iOS Dev
📖 В материале с таким названием предлагается узнать, как писать масштабируемый код с использованием VIPER и некоторыми приемами из других архитектур.
Я согласен с автором по многим пунктам.
🧐 Во-первых, НЕ стоит думать, что VIPER — это плохо потому, что кто-то неправильно им воспользовался. MVP хорош для приложения с небольшим объёмом экранов, и я согласен с тем, что не следует использовать VIPER для таких приложений.
🤔 Проблемы могут начаться, когда в приложение попадает все больше компонентов. И вот тут стоит задуматься, а точно ли всё хорошо?
Если в ваших планах небольшое приложение, можно начать с MVC. Позже можно решить проблему массивных контроллеров с помощью MVVM, также подойдет MVP или паттерн координатора.
Автор заверяет, что плохой архитектуры не бывает. Есть плохой выбор, который приводит нас к сложной кодовой базе.
🛠Чтобы писать по-настоящему масштабируемые приложения, можно познакомиться с VIPER с конструктором модулей = VIPER(B).
@iOS Dev
This media is not supported in your browser
VIEW IN TELEGRAM
Wave — опенсорсное решение для анимаций
Wave — это анимационный движок для iOS и iPadOS. С его помощью легко создавать плавные, интерактивные и прерываемые анимации, которые приятно выглядят.
Согласно заявлениям разработчиков, Wave не имеет внешних зависимостей и может быть легко внедрен в существующие проекты и приложения на базе UIKit.
😉 Основная особенность Wave заключается в том, что все анимации являются ретаргетируемыми. Например, вы можете изменить конечную точку в процессе, и анимация будет изящно перенаправлена на это новое значение.
🛠 Код и пример приложения доступен на Github.
#opensource
@iOS Dev
Wave — это анимационный движок для iOS и iPadOS. С его помощью легко создавать плавные, интерактивные и прерываемые анимации, которые приятно выглядят.
Согласно заявлениям разработчиков, Wave не имеет внешних зависимостей и может быть легко внедрен в существующие проекты и приложения на базе UIKit.
😉 Основная особенность Wave заключается в том, что все анимации являются ретаргетируемыми. Например, вы можете изменить конечную точку в процессе, и анимация будет изящно перенаправлена на это новое значение.
🛠 Код и пример приложения доступен на Github.
#opensource
@iOS Dev