Горячее
Лучшее
Свежее
Подписки
Сообщества
Блоги
Эксперты
Войти
Забыли пароль?
или продолжите с
Создать аккаунт
Я хочу получать рассылки с лучшими постами за неделю
или
Восстановление пароля
Восстановление пароля
Получить код в Telegram
Войти с Яндекс ID Войти через VK ID
Создавая аккаунт, я соглашаюсь с правилами Пикабу и даю согласие на обработку персональных данных.
ПромокодыРаботаКурсыРекламаИгрыПополнение Steam
Пикабу Игры +1000 бесплатных онлайн игр
Игра «История одной фермы» - увлекательное и бросающее вызов вашим серым клеточкам приключение, от которого невозможно оторваться!

История одной фермы - маджонг

Маджонг, Казуальные, Приключения

Играть

Топ прошлой недели

  • AlexKud AlexKud 38 постов
  • SergeyKorsun SergeyKorsun 12 постов
  • SupportHuaport SupportHuaport 5 постов
Посмотреть весь топ

Лучшие посты недели

Рассылка Пикабу: отправляем самые рейтинговые материалы за 7 дней 🔥

Нажимая кнопку «Подписаться на рассылку», я соглашаюсь с Правилами Пикабу и даю согласие на обработку персональных данных.

Спасибо, что подписались!
Пожалуйста, проверьте почту 😊

Помощь Кодекс Пикабу Команда Пикабу Моб. приложение
Правила соцсети О рекомендациях О компании
Промокоды Биг Гик Промокоды Lamoda Промокоды МВидео Промокоды Яндекс Директ Промокоды Отелло Промокоды Aroma Butik Промокоды Яндекс Путешествия Постила Футбол сегодня

Swift + Программирование

С этим тегом используют

Политика Санкции Банк Экономика Россия Тинькофф банк IT Программист IT юмор Разработка Python Картинка с текстом Юмор Все
42 поста сначала свежее
1
tproger.official
tproger.official
7 месяцев назад
Типичный программист

Легкое недопонимание(⁠⁠

Легкое недопонимание( IT юмор, Программирование, IT, Программист, Swift, Мемы, Тейлор Свифт
Показать полностью 1
IT юмор Программирование IT Программист Swift Мемы Тейлор Свифт
17
Блог компании
VSKurs
VSKurs
10 месяцев назад

ТОП-15 лучших курсов Swift: обучение онлайн с нуля для начинающих, платные + бесплатные⁠⁠

В этой статье сравниваем ТОП-15 лучших обучающих онлайн-курсов Swift программирования (подходят для начинающих с нуля и продвинутых специалистов) + рассматриваем бесплатные курсы.

Swift — это мощный язык программирования, созданный Apple. Он обеспечивает безопасность типов, современный синтаксис и высокую производительность. Используется для разработки приложений для iOS, macOS, watchOS и tvOS. Поддерживает как объектно-ориентированное, так и функциональное программирование, предлагая удобные инструменты для работы со строками, коллекциями и асинхронными задачами.

1. Курс «Мобильный разработчик» [Skillbox] - 1085 отзывов

Информация о курсе: стоимость — 4 911 ₽ / мес. в рассрочку на 34 месяца, длительность — 7 месяцев

Особенности: Для новичков - не требуется предварительный опыт и навыки в IT. Эксперты будут предоставлять обратную связь по вашим практическим заданиям. Центр карьеры поможет с трудоустройством. Доступ к курсу и чату в Telegram остается навсегда.

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

Чему вы научитесь:

  • Программировать на востребованном языке
    Освоите Kotlin для Android или Swift для iOS, изучая как базовые возможности, так и продвинутые концепции языка.

  • Создавать мобильные приложения
    Научитесь верстать экраны, размещать кнопки и изображения, а также программировать логику приложений. Сможете публиковать свои проекты в Google Play или App Store.

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

  • Тестировать приложения
    Узнаете, как использовать эмуляторы и симуляторы для проверки кода и тестирования приложений в различных условиях.

  • Использовать актуальные инструменты разработки
    Научитесь работать с Android SDK или iOS SDK, создавая динамичные приложения с доступом к камере и местоположению.

  • Применять актуальные навыки в работе
    Сразу после курса сможете начать карьеру Android или iOS-разработчика в современной компании.

Содержание программы обучения:

  • Kotlin
    Изучите Kotlin, приоритетный язык для разработки Android-приложений, а также принципы ООП, асинхронного и реактивного программирования.

  • Android-разработчик. Уровень 1
    Освоите основы Android-разработки: верстку экранов, анимацию интерфейсов, программирование логики, работу с данными и сетью. Создадите более 7 мини-проектов, включая квиз, галерею, новостную ленту и карту достопримечательностей.

  • Android-разработчик. Уровень 2
    Изучите продвинутые техники разработки: изменение интерфейсов, оптимизация производительности, паттерны проектирования и реактивное программирование.

  • Трудоустройство с помощью Центра карьеры Skillbox
    Подготовитесь к реальной практике, создадите резюме и портфолио, подготовитесь к собеседованию. Карьерный консультант поможет найти вакансии и организовать интервью.

  • iOS-разработчик.

Дополнительные курсы:

  • Figma
    Освоите популярный инструмент для создания интерфейсов.

  • Тестирование
    Научитесь писать проверочные тесты и находить баги.

  • Карьера и развитие для программиста
    Узнаете, как расти в профессии и развиваться как программист.

Подробнее о курсе Swift →

2. Курс «iOS-разработчик с нуля» [Нетология] - 426 отзывов

Информация о курсе: стоимость — 125 400 ₽ или рассрочка на 36 месяцев - 3 666 ₽ / мес., длительность — 11 месяцев

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

Научитесь создавать мобильные приложения для устройств Apple на языке Swift 5. Изучите два самых популярных фреймворка для создания пользовательского интерфейса: UIKit и SwiftUI.

На курсе вы научитесь:

  • Разрабатывать мобильные приложения для Apple с нуля на языке Swift 5

  • Верстать графические интерфейсы с использованием UIKit и SwiftUI

  • Настраивать интеграции с бэкендом приложения

  • Адаптировать мобильные приложения для различных платформ и операционных систем

  • Тестировать мобильные приложения

  • Реализовывать авторизацию пользователей через логин и пароль, а также через Touch ID и Face ID.

Программа курса:

  • Основы Swift

  • Расширенные возможности Swift

  • Git — система контроля версий

  • Создание интерфейса приложения

  • Промышленная разработка

  • Асинхронная разработка и многопоточность

  • Работа с сетью и хранение данных

  • Продвинутая iOS-разработка

  • Тестирование iOS-приложений

  • Фреймворк SwiftUI

  • Разработка для iPad, Apple TV и Apple Watch

  • Карьера в iOS-разработке.

Бонусные модули:

  • Английский язык для начинающих разработчиков

  • Основы графического дизайна

  • Мобильная аналитика для программистов

  • Логические операторы и алгоритмы.

Подробнее о курсе Swift →

3. Курс «iOS-разработчик» [GeekBrains] - 1374 отзыва

Информация о курсе: стоимость — 129 900 ₽ или рассрочка - от 3 609 ₽ / мес., длительность — 9 месяцев

Особенности: 170 часов практики на реальных проектах. Помощь в трудоустройстве. Получение диплома о профессиональной переподготовке.

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

Программа курса:

  • Введение в программирование

  • Основы контроля версий

  • Знакомство с языками программирования

  • Введение в веб-технологии

  • Алгоритмы и структуры данных

  • Основы баз данных

  • Углубленное изучение контроля версий (Git)

  • Основы языка Swift

  • Разработка приложений на Swift

  • Objective-C для iOS-разработчиков

  • Операционные системы и виртуализация (Linux)

  • Подготовка дипломной работы

  • Защита дипломного проекта

  • Стратегия поиска работы

  • Как и где искать вакансии

  • Подготовка резюме

  • Подготовка к собеседованию.

Подробнее о курсе Swift →

4. Курс «iOS-разработчик» [SkillFactory] - 312 отзывов

Информация о курсе: стоимость — от 4 690 руб. / мес. в рассрочку на 36 месяцев, длительность — 13 месяцев

Особенности: Вы создадите 5 приложений для своего портфолио. Центр карьеры поможет вам подготовиться к трудоустройству: предоставит много практики, реальные проекты для портфолио, помощь с составлением резюме и возможность познакомиться с потенциальными работодателями. По окончании курса вы получите сертификат и диплом о профессиональной переподготовке.

Программа онлайн-курса:

  • Введение в курс и погружение в IT

  • Изучение Swift

  • Создание интерфейсов и архитектур приложения

  • Работа с данными и их хранение

  • Многопоточность

  • Сетевое взаимодействие

  • UX/UI-дизайн для мобильного разработчика

  • Дополнительные фреймворки

  • Тестирование

  • Сборка и подготовка к публикации приложения

  • Дипломная работа

  • Objective-C.

Получаемые навыки:

  • Разработка приложений на Swift

  • Применение принципов объектно-ориентированного программирования

  • Ведение контроля версий в Git

  • Создание интерактивных, эстетически приятных и понятных интерфейсов с использованием UIKit, WebKit и Safari Services

  • Хранение данных и работа с ними, использование Core Data и Realm

  • Организация многопоточности с помощью Grand Central Dispatch и Operation

  • Обеспечение взаимодействия приложений с внешними сервисами и серверами

  • Тестирование приложений с использованием XCTest и технологии Test Driven Development

  • Оптимизация работы ПО с помощью Xcode Instruments

  • Адаптация приложений для различных устройств Apple

  • Публикация и поддержка проектов в App Store.

Подробнее о курсе Swift →

5. Курс «iOS Developer. Professional» [OTUS] - 303 отзыва

Информация о курсе: стоимость — 82 800 ₽ или рассрочка - от 8 280 ₽ / мес., длительность — 5 месяцев

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

После обучения вы сможете на профессиональном уровне:

  • Проектировать сложные UI-компоненты и оптимизировать их производительность

  • Разрабатывать клиент-серверные приложения и обеспечивать их работу в оффлайн-режиме

  • Писать код, который можно тестировать с помощью unit-тестов, и успевать создавать сами тесты.

Программа курса:

  • SwiftUI и основы Combine

  • Современная архитектура мобильных приложений

  • Foundation без сторонних фреймворков и библиотека Swift 5 Standard Library

  • Многозадачность

  • CoreML и Vision, нейронные сети и машинное обучение

  • Сетевое взаимодействие и хранение данных

  • Создание приложений для Apple Watch, TV и Mac

  • Мультиплатформенная разработка: перенос на Android, Vulkan/Metal

  • Организация разработки

  • Проектная работа.

Подробнее о курсе Swift →

6. Курс «Swift. Основы программирования» [Специалист] - 45 отзывов

Информация о курсе: стоимость — нет информации, длительность —  24 ак. ч. + 12 ак. ч.

Изучите основы программирования на примере нового и популярного языка Swift от Apple.

Вы научитесь:

  • Работать с кортежами

  • Обращаться с опционалами

  • Применять конструкцию switch в Swift

  • Использовать оператор guard

  • Манипулировать массивами, словарями и наборами

  • Работать с замыканиями.

Программа курса:

  • Добро пожаловать в мир Swift

  • Основы

  • Базовые операторы и строки

  • Коллекции и управление выполнением кода

  • Функции и замыкания

  • Выполнение итоговой работы.

Подробнее о курсе Swift →

7. Курс «Swift. Объектно - ориентированное программирование» [Специалист] - 45 отзывов

Информация о курсе: стоимость — нет информации, длительность — 32 ак. ч. + 16 ак. ч.

Слушатели ознакомятся с основными концепциями ООП на примере языка Swift. В курсе будут рассмотрены классы и структуры, инкапсуляция, наследование, полиморфизм, инициализация и деинициализация, ARC, дженерики, расширения, протоколы и обработка ошибок.

Программа курса:

  • Классы, структуры, перечисления

  • Свойства, методы и индексаторы

  • Наследование, инициализация и деинициализация

  • Автоматический подсчёт ссылок, опциональное связывание, приведение типов, вложенные типы

  • Обработка ошибок

  • Расширения, протоколы, дженерики, управление доступом, продвинутые операторы

  • Выполнение итоговой работы.

Подробнее о курсе Swift →

8. Курс «iOS разработчик» [Яндекс.Практикум] - 71 отзыв

Информация о курсе: стоимость — 143 000 ₽, длительность — 10 месяцев

Программа курса:

  • Введение в iOS-разработку и основы языка Swift

  • Основы вёрстки, сетевого взаимодействия и хранения данных

  • Навигация, работа с таблицами, авторизация и основы многопоточности

  • Коллекции, базы данных и архитектура приложений

  • Продуктовая и командная разработка

  • Командный итоговый проект

  • Подготовка к трудоустройству.

Подробнее о курсе Swift →

9. Курс «Разработка iOS приложений, для детей» [CODDY] - 29 отзывов

Информация о курсе: стоимость — нет информации, длительность — 6 месяцев

В рамках курса дети изучат язык программирования Swift — современный объектно-ориентированный язык, оптимизированный для создания приложений для мобильных устройств. Они изучат основы разработки приложений для платформы iOS (устройства iPhone и iPad) и познакомятся с различными фреймворками, которые являются неотъемлемой частью современных iOS-приложений.

Уникальный курс Стэнфордского университета был адаптирован специалистами CODDY для детей от 14 лет.

За 6 месяцев курса дети:

  • Познакомятся с основами языка Swift

  • Напишут игры «Concentration» (Найди пару) и «Set» (Сет)

  • Разберутся в создании грамотной архитектуры приложений

  • Научатся использовать элементы интерфейса iOS

  • Освоят работу с мультитачем и жестами

  • Познакомятся с iCloud и файловой системой

  • Узнают, как делать уведомления

  • Опробуют возможности гироскопа и камеры.

Подробнее о курсе Swift →

10. Курс «iOS разработчик» [TeachMeSkills] - 25 отзывов

Информация о курсе: стоимость — 3 060 BYN (84 939 руб.), длительность — 6 месяцев

Твой результат по окончании курса:

  • Освоишь язык программирования Swift с нуля и объектно-ориентированное программирование (ООП)

  • Научишься проектировать и анимировать интерфейсы

  • Научишься работать с сетью и хранить данные

  • Разработаешь и опубликуешь приложение в App Store

  • Узнаешь способы монетизации мобильных приложений

  • Станешь востребованным iOS-разработчиком.

Подробнее о курсе Swift →

11. Курс «macOS программирование на Swift в Xcode» [ЧОУ ДПО «Институт прикладной автоматизации и программирования»] - 22 отзыва

Информация о курсе: стоимость — нет информации, длительность — 30 ак. ч.

В этом курсе мы спроектируем, разработаем и опубликуем в App Store полностью функциональное macOS-приложение "Конвертер валют". Приложение будет загружать курсы валют с сайта Центробанка, парсить их, отображать в удобном виде и конвертировать валюты с учетом текущего курса.

Также в ходе курса мы создадим приложение-таймер, изучим основы языка Swift и научимся программировать основные элементы управления для macOS-приложений.

Мы пройдем весь цикл разработки macOS-приложения: от создания проекта до его публикации в App Store.

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

Приложения, созданные в ходе курса, можно будет использовать в портфолио при трудоустройстве, а также выставить на продажу в App Store и зарабатывать на этом.

Подробнее о курсе Swift →

12. Курс «Структуры данных и алгоритмы в Swift» [Свифт Лаб]

Информация о курсе: стоимость — 6 990 ₽, длительность — 24 видеоурока

В этом курсе вы узнаете:

  • как реализовывать структуры данных,

  • когда и почему следует использовать определённые структуры данных или алгоритмы.

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

Эти знания станут отличной основой для создания более сложных и специализированных приложений. Научитесь реализовывать структуры данных и алгоритмы в Swift! Курс охватывает широкий спектр тем: от базовых структур данных до сложных алгоритмов поиска путей.

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

Подробнее о курсе Swift →

Бесплатные курсы и уроки Swift

Курс «Разработка IOS-приложений на Swift» [GeekBrains]

2 урока о разработке IOS-приложений на Swift.

Подробнее о курсе Swift →

Курс «Введение в Swift» [Хекслет]

Уроки курса:

  • Основы Swift
    Знакомство с языком программирования Swift

  • TypeAlias и Tuple в Swift
    Изучение понятий TypeAlias и Tuple в языке Swift

  • Optional в Swift
    Понимание концепции Optional в языке Swift

  • Операторы и диапазоны в Swift
    Изучение операторов языка Swift

  • Работа со строками в Swift
    Начало работы со строками в языке Swift

  • Массивы в Swift
    Изучение работы с массивами в языке Swift

  • Словари в Swift
    Изучение типа данных Dictionary в языке Swift

  • Ветвление в Swift
    Изучение операторов ветвления в языке Swift

  • Функции в Swift
    Создание и использование функций в языке Swift

  • Параметры в Swift
    Изучение использования переменного количества параметров в языке Swift

  • И другие.

Подробнее о курсе Swift →

Курс «Swift» [Академия IT]

Уроки курса:

  • Введение

  • Типы данных и коллекции

  • Опциональные типы

  • Циклы

  • Условный оператор if

  • Условный оператор switch case

  • Функции

  • Блоки

  • Классы и их конструкторы.

Подробнее о курсе Swift →

Зачем учить Swift?

Swift – это мощный и удобный язык программирования, разработанный Apple. Давайте рассмотрим причины, по которым его стоит учить:

1. Платформы Apple

Swift предназначен для разработки приложений для iOS, macOS, watchOS и tvOS. Если вам интересно создавать приложения для iPhone, iPad, Apple Watch или Mac, знание Swift – это просто необходимый навык.

2. Современный и безопасный

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

3. Удобство и простота

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

4. Высокая производительность

Swift разработан с учетом производительности. Он компилирует код в машинный язык, что делает приложения быстрыми и эффективными. В некоторых случаях приложения на Swift могут работать быстрее, чем написанные на Objective-C.

5. Открытый исходный код

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

6. Потенциал для карьеры

Разработка приложений для Apple устройств – это огромный рынок, и спрос на разработчиков Swift высок. Это может открыть перед вами множество карьерных возможностей.

7. Поддержка и экосистема

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

8. Инновации

Apple активно внедряет инновации в свои разработки, и знание Swift позволяет оставаться на гребне волны технологического прогресса.

Чем хорош Swift?

Вот несколько причин, почему Swift заслуживает внимания:

1. Безопасность

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

2. Скорость и Производительность

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

3. Интерфейс с Objective-C

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

4. Современный и Удобный Синтаксис

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

  • Инверсия типов

  • Дополнения и расширения

  • Управление памятью с помощью Automatic Reference Counting (ARC)

5. Кросс-платформенность

Хотя Swift первоначально был предназначен для экосистемы Apple, он стал кроссплатформенным языком, и теперь его можно использовать для разработки серверных приложений, а также приложения для популярных платформ Linux и Windows.

6. Поддержка и Сообщество

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

7. Игры на Swift

С использованием фреймворка SpriteKit и Metal, Swift — отличный выбор для разработки игр на устройствах Apple.

8. Интеграция с Xcode

Swift прекрасно интегрируется с Xcode, что делает процесс разработки более приятным и удобным. Интеграция с инструментами, такими как Interface Builder и Storyboards, позволяет создавать пользовательские интерфейсы более интуитивно.

Что можно сделать на языке Swift?

На языке Swift можно разработать множество различных приложений и программ. Вот некоторые из основных возможностей:

1. Разработка iOS и iPadOS приложений

Swift используется в основном для разработки мобильных приложений для iPhone и iPad. Это включает в себя создание приложений для:

  • Социальных сетей (например, Instagram, Facebook)

  • Игры (простые как Flappy Bird и сложные как PUBG)

  • Управления задачами (например, Todoist)

  • Электронной коммерции (например, Amazon, eBay)

2. Разработка macOS приложений

Swift также поддерживает создание приложений для компьютеров Mac:

  • Текстовые редакторы (например, Bear)

  • Графические редакторы (например, Affinity Photo)

  • Утилиты и инструменты для выполнения заданий (например, Alfred)

3. Разработка серверных приложений

С помощью Swift также можно разрабатывать серверные приложения. Есть несколько фреймворков, таких как:

  • Vapor

  • Kitura

4. Разработка для watchOS и tvOS

Swift используется для создания приложений для Apple Watch и Apple TV.

5. Разработка системного программного обеспечения

Хотя Swift менее часто используется для этой задачи по сравнению с языками уровня C или C++, его сильная типизация и безопасность делают его подходящим для определенных системных задач.

6. Язык сценариев и командных файлов

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

Сколько времени нужно, чтобы изучить Swift?

Изучение нового языка программирования, такого как Swift, может сильно варьироваться в зависимости от вашего предшествующего опыта, целеустремленности и доступного времени для занятий. Давайте разделим этот процесс на несколько ключевых этапов:

  1. Основы и синтаксис:

    • Время: 2–4 недели

    • Описание: выучить базовый синтаксис Swift, такое как переменные, циклы, функции и условные конструкции. Если у вас уже есть опыт программирования на другом языке, то этот этап может занять меньше времени.

  2. Продвинутые концепции:

    • Время: 1–2 месяца

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

  3. Создание проектов и упражнений:

    • Время: 2–4 месяца

    • Описание: после того как вы освоите основы и продвинутые концепции, начните работать над реальными проектами. Это могут быть малые приложения, учебные проекты или участие в код-ритуалах (кодинговых сессиях).

  4. Изучение экосистемы:

    • Время: 2–3 месяца

    • Описание: освоение экосистемы Swift, включая Xcode, интерфейсные компоненты (UIKit/SwiftUI), взаимодействие с API и т. д.

  5. Продолжение обучения и профессиональное развитие:

    • Время: постоянно

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

Показать полностью
Удаленная работа Фриланс Обучение Дистанционное обучение Курсы Онлайн-курсы Курсы повышения квалификации Образование Развитие Карьера Учеба Работа Профессия Онлайн-школа Онлайн Полезное Бесплатное обучение Программирование Курсы программирования Swift Блоги компаний Длиннопост
3
andrey.zarembo
andrey.zarembo
1 год назад
Серия Дневник разработчика

Навигация в SwiftUI / 4 min⁠⁠

Навигация в SwiftUI / 4 min IT, Дневник, Научпоп, Swift, Программирование, Длиннопост, Видео, Без звука

В этой статье вы прочитаете:

  • Как открывается попап / модальное окно

  • Как открыть другой экран на примере галереи

  • Как вернуться назад

  • Как открыть экран, связанный с объектом - на примере просмотра фото

Примеры изображений и кода из этой статьи доступны на GitHub

Для примеров я использую NavigationStack, доступный в iOS 16+.

Как открывается попап / модальное окно

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

Для отображения будет использоваться единый флаг AccessLevel. Этот флаг меняется в разных частях приложения через Binding. В случае его обновления сработает обновление состояния основного View приложения и будет отображен блокирующий экранчик проверки возраста.

Навигация в SwiftUI / 4 min IT, Дневник, Научпоп, Swift, Программирование, Длиннопост, Видео, Без звука

Код примера

Как открыть другой экран на примере галереи

Галерея - это экран, который не зависит от конкретного объекта, это просто экран в стеке. Поэтому для его отображения будет использоваться NavigationPath. Если грубо, то это последовательность элементов, которые определяют состояние NavigationStack. Один элемент - один экран.

Навигация в SwiftUI / 4 min IT, Дневник, Научпоп, Swift, Программирование, Длиннопост, Видео, Без звука

Я добавлю enum который будет определять необходимый экран. Для примера в нем будет один элемент - gallery, но такой подход позволяет добавить любое количество необходимых экранов, а associated value в enum позволят добавить данные или настройки для экрана. Данные о необходимом для открытии экране придут в модификатор navigationDestination с указанным enum.

Навигация в SwiftUI / 4 min IT, Дневник, Научпоп, Swift, Программирование, Длиннопост, Видео, Без звука

Код примера

Теперь для отображения экрана галереи необходимо в path через метод append добавить значение gallery.

Навигация в SwiftUI / 4 min IT, Дневник, Научпоп, Swift, Программирование, Длиннопост, Видео, Без звука

Код примера

Как вернуться назад

Чтобы вернуться назад необходимо вызывать метод dismiss у глобального объекта presentationMode, доступного по аналогичному ключу. Я повесил обработчик на левую кнопку верхней панели на экранах галереи и просмотра фото.

Навигация в SwiftUI / 4 min IT, Дневник, Научпоп, Swift, Программирование, Длиннопост, Видео, Без звука

Код примера

Как открыть экран, связанный с объектом - на примере просмотра фото

Экран просмотра фото - это экран, связанный с объектом - фотографией. Этому экрану обязательно надо передать изображение, которое он будет отображать. Самое подходящее место для передачи информации о фотографии - это сетка галереи GalleryGrid, которая обрабатывала выбор фото. Но протаскивать туда ссылку на path будет очень неудобно.

Но этого можно не делать, если использовать NavigationLink. Этот объект существует в двух основных вариантах:

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

  2. В параметрах Оформление и объект для навигации - это то, что я буду использовать для перехода из галереи в экран фотографии

Я добавил в GalleryGrid, созданной в статье про галерею, режим выбора и когда он выключен, галерея работает как переход на просмотр фото. NavigationLink в оverlay с Сolor.clear в качестве оформления будет работать как невидимая кнопка для перехода. NavigationLink отправит объект image в ближайший по иерархии NavigationStack.

Навигация в SwiftUI / 4 min IT, Дневник, Научпоп, Swift, Программирование, Длиннопост, Видео, Без звука

Код примера

В основном коде добавляется обработчик этих объектов через модификатор navigationDestination, который будет обрабатывать объекты MediaItem

Код примера

Я добавил .navigationBarHidden(true), потому что в приложении используются собственные панели и не требуется системная панель с кнопкой назад

Вот как это работает

Заключение

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

Все работающие примеры есть в проекте на Github, их можно скачать и запустить.

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

Показать полностью 6 1
[моё] IT Дневник Научпоп Swift Программирование Длиннопост Видео Без звука
0
Партнёрский материал Реклама
specials
specials

Сколько нужно времени, чтобы уложить теплый пол?⁠⁠

Точно не скажем, но в нашем проекте с этим можно справиться буквально за минуту одной левой!

Попробовать

Ремонт Теплый пол Текст
4
andrey.zarembo
andrey.zarembo
1 год назад
Серия Дневник разработчика

Swift Combine - Часть 2 / 4 min⁠⁠

Это вторая статья о работе со Swift Combine, в ней я расскажу про математические операции, поиск совпадений, операции с элементами по индексам, выбор и объединение потоков. Ссылка на первую статью

Swift Combine - Часть 2 / 4 min IT, Дневник, Научпоп, Swift, Программирование, Длиннопост

В этой статье вы прочитаете:

  • Операции

  • Math
    Matching
    Sequence
    Select
    Collecting & Republishing

Примеры кода из этой статьи доступны на GitHub

Операции и преобразования

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

У некоторых операций есть try... вариант, который позволяет вернуть ошибку, но я их дополнительно не описывал.

Math

  • .count - подсчитывает количество объекто в возвращает число

  • .max - возращает самый большой объект. Он должен соответствовать Comparable. В примере просто сравниваются числа

  • .max(by ) - возвращает самый большой объект, но сравнение выполняется в блоке. В примере числа красных объектов умножаются на 10

  • .min - возращает самый маленький объект. Он должен соответствовать Comparable. В примере просто сравниваются числа

  • .min(by ) - возвращает самый маленький объект, но сравнение выполняется в блоке. В примере числа красных объектов умножаются на 10

Matching

  • .contains - возвращает bool, есть ли объект в потоке. Он должен соответствовать Equitable. В примерах 1 и 2 ищется синий треугольник

  • .contains(where: ) - возвращает bool, есть ли объект в потоке, но сравнение выполняется в блоке. В примере 3 ищется любой треугольник

  • .allSatisfy - возвращает bool, если все объекты соответствует условию в блоке. В примере ищутся звездочки

Sequence

Swift Combine - Часть 2 / 4 min IT, Дневник, Научпоп, Swift, Программирование, Длиннопост
  • .drop(while:) - пропускает все элементы, пока они соответствую условию в блоке. Как только пришел другой объект, ничего больше отбрасываться не будет. В примере 1 и 2 условие - треугольник. Пока они в начале - отбрасываются, а после звезды уже остаются. Позволяет отфильтровать стартовые данные, заголовки и др

  • .drop(untilOutputFrom:) - пропускает все элементы потока, пока другой поток не выдаст сигнал. Например игнорировать таймер, пока не пришел флаг начала анимации

  • .dropFirst - отбрасывает первый элемент в потоке

  • .dropFirst(n) - отбрасывает первые N элементов в потоке

  • .append(...) - добавляет к завершившемуся потоку набор данных в конец. В примере добавляются треугольник, звезда и звездочка

  • .append( pub ) - добавляет к завершившемуся потоку данные из другого потока. В примере красная звездочка игнорируется, т.к. первый поток на тот момент не завершился, а остальные элементы добавляются в конец.

  • .prepend(...) - добавляет в начало потока набор данных. В примере добавляются треугольник, звезда и звездочка

  • .prepend( pub ) - добавляет в начало данные из завершившегося потока

  • .prefix(n) - возвращает первые n элементов потока

  • .prefix(untilOutputFrom:) - возвращает элементы потока, пока второй поток не выдаст сигнал

  • .prefix(while: n) - возвращает элементы потока, пока они соответствуют условиям. После нарушения условия выдача останавливается

Swift Combine - Часть 2 / 4 min IT, Дневник, Научпоп, Swift, Программирование, Длиннопост

Select

Swift Combine - Часть 2 / 4 min IT, Дневник, Научпоп, Swift, Программирование, Длиннопост
  • .first - возвращает первый элемент потока

  • .first(where: ) - возвращает первый элемент потока, соответствующий условию в блоке

  • .last - возвращает последний элемент завершившегося потока

  • .last(where: ) - возвращает последний элемент завершившегося потока, соответствующий условию в блоке

  • .output(at:) - возвращает элемент с определенным индексом из потока

  • .output(in:) - возвращает элементы с индексами из диапазона

Collecting & Republishing

Swift Combine - Часть 2 / 4 min IT, Дневник, Научпоп, Swift, Программирование, Длиннопост
  • .combineLatest( pub ) { a,b } - комбинирует элемент последнего сигнала потока с последним элементом другого потока. В примере сначала приходят красная звезда в потоке 1 и оранжевая единица в потоке 2, получается их пара. Затем в потоке 1 приходит синяя звезда и она комбинируется с оранжевой единицей в потоке 2. Фиолетовая двойка в потоке 2 приходит в тот же временной слот, но все-таки после синей звезды. И там по очереди Поток 1, Поток 2 приходят и сочетаются с последним сигналом другого потока

  • .combineLatest( pub ) { tuple } - у метода есть другой вариант, который возвращает не два параметра, а один tuple

  • .combineLatest ABC и ABCD - выполняет такие же операции, но сочетая 3 и 4 потока

  • .merge - склеивает несколько поток в один по мере поступления данных

  • .zip - собирает потоки в пары / тройки / четверки в порядке их следования в потоках. Сначала все первые элементы, потом все вторые и т.д. Поэтому на одинаковых данных zip дает 3 пары элементов, а combineLatest - 5

Заключение

В этой статье кратко рассмотрены операции групп Math, Matching, Sequence, Select, Collecting и Republishing с визуализацией. Все визуализации получены в приложении-песочнице.

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

Все работающие примеры preview есть в проекте на Github, их можно скачать и запустить.

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

Показать полностью 4
[моё] IT Дневник Научпоп Swift Программирование Длиннопост
1
1
andrey.zarembo
andrey.zarembo
1 год назад
Серия Дневник разработчика

Отображение фото / 5 min⁠⁠

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

Отображение фото / 5 min IT, Дневник, Научпоп, Swift, Программирование, Длиннопост

В этой статье вы прочитаете:

  • Как отображать фотографии в разных режимах

  • Какие есть сложности в работе с просмотром фото в SwiftUI

  • Как реализовать просмотр фото на UIKit и через Prepresentable интегрировать его в SwiftUI

Примеры изображений и кода из этой статьи доступны на GitHub

Отображение фотографий в разных режимах

В приложении фотография отображается в трех режимах:

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

Отображение фото / 5 min IT, Дневник, Научпоп, Swift, Программирование, Длиннопост

Редактор фото - отображается исходное изображение, которое обрезано и к нему применен фильтр. Наклейки отображаются поверх в виде самостоятельных View, которые можно перемещать. Про наклейки будет отдельный пост.

Отображение фото / 5 min IT, Дневник, Научпоп, Swift, Программирование, Длиннопост

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

Отображение фото / 5 min IT, Дневник, Научпоп, Swift, Программирование, Длиннопост

Во всех трех режимах изображение можно масштабировать двумя пальцами или слайдером и двигать. Режим аналогичен системному приложению "Фото".

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

Какие есть сложности в работе с просмотром фото в SwiftUI

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

Основные проблемы:

  1. ScrollView в SwiftUI не умеет из коробки работать с Zoom. Его можно эмулировать через ScaleEffect и MagnificationGesture(). Однако смещение будет сбиваться, т.к. жест масштабирования не возвращает свои стартовые точки

  2. Аналогичная проблема будет с вращением. От жеста можно получить угол поворота, но не центр

  3. Тяжело развести жесты обрезки и скролла. Если привязать жест к "ручке" изменения размера, то при резком перемещении он будет "отваливаться" и перемещение будет сбрасываться. И я не смог привязать жест к контейнеру и фильтровать его работу в зависимости от того, где был начат жест.

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

Результат опытов со SwiftUI можно посмотреть в Github

Просмотр фото на UIKit и обертка в Representative

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

Код готового компонента можно найти на Github

Как будет устроен компонент:

Отображение фото / 5 min IT, Дневник, Научпоп, Swift, Программирование, Длиннопост
  • Scroll View - будет выполнять Zoom и Scroll

  • Container View - будет делать обрезку фото в режиме редактирования и обеспечивать зону для вращения фото в режиме обрезки и поворота. Внутри ScrollView, является ViewForZooming

  • Image View - будет отображать изображение, обрезанное или оригинальное. Центром привязано к Container View. В режиме редактирования смещается так, чтобы видимая в Container View часть совпадала с CropZoneView. В режиме редактирования и обрезки поворачивается на заданный угол.

  • CropZoneView - виртуальная View для отладки. В режиме обрезки рамка обрезки совпадает с CropZoneView, но отрисовывается в глобальных координатах, чтобы ручки изменения размера были одного размера независимо от масштаба.

Какие функции будет реализовывать компонент:

Скролл с отступами и центрированием

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

Для этого необходимо управлять параметром ContentOffset

Отображение фото / 5 min IT, Дневник, Научпоп, Swift, Программирование, Длиннопост

Код примера выше

Расположение фото фото и поворот

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

Отображение фото / 5 min IT, Дневник, Научпоп, Swift, Программирование, Длиннопост

Код примера выше

Обрезка фото

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

Сохранение данных об обрезке и повороте фотографии

Обрезанная и повернутая фотография получается из оригинальной с помощью серии операций:

  1. Сдвиг центра - сохраняется как Crop Center

  2. Новый размер - сохраняется как Crop Size

  3. Поворот - В приложении для детей есть ползунок с диапазоном поворота -45...45 градусов и кнопка вращения на 90 градусов. Поэтому хранятся два значения, малый угол и квадрант нуля

Все размеры хранятся в виде относительных значений. За 1 берется диагональ изображения. Сдвиг центра отсчитывается от центра изображения.

Отображение фото / 5 min IT, Дневник, Научпоп, Swift, Программирование, Длиннопост

Использование Representable

Чтобы SwiftUI работал с UIKit не вдаваясь в детали, создается UIViewRepresentable или UIViewControllerReplresentable.

У меня ViewController, поэтому дальше будет про него, но для UIVIew работает точно так же. Его код можно найти на GitHub

Этот прокси объект отвечает за то, чтобы создать View или ViewController, положить его в правильное место иерархии View и обработать передачу состояния в обе стороны.

View создается в методе makeUIViewController. Необходимо вернуть настроенный ViewController

У этого объекта создаются свойства SwiftUI: @State, @Bindable и др. Изменение эти свойств приводит к вызову метода updateUIViewController, который позволяет обновить свойства у UIKit ViewController.

Для обновления данных в обратную сторону создается объект, который называется Coordinator. В нем можно разместить все Binding переменные и передать сам объект во ViewController, чтобы обновлять значения.

При изменений значений внутри ViewController, необходимо новые значения сохранить в wrappedValue Binding координатора. Тогда SwiftUI пробросит их всем подпищикам изменений

Заключение

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

Все работающие примеры есть в проекте на Github, их можно скачать и запустить.

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

Показать полностью 7
[моё] IT Дневник Научпоп Swift Программирование Длиннопост
0
1
andrey.zarembo
andrey.zarembo
1 год назад
Серия Дневник разработчика

Swift Combine - Часть 1 / 5 min⁠⁠

Это первая статья о работе со Swift Combine. Из неё вы узнаете о реактивном программировании и операциях преобразования, фильтрации и свертки сигналов.

Swift Combine - Часть 1 / 5 min IT, Дневник, Научпоп, Swift, Программирование, Длиннопост

В этой статье вы прочитаете:

  • Что такое Combine и реактивное программирование

  • Операции: Mapping, Filtering, Reducing

Примеры кода из этой статьи доступны на GitHub

Что такое Combine и реактивное программирование

Swift Combine - это интегрированная в язык Swift реализация реактивного программирования.

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

Пусть для простоты будут следующие операции:

  1. Получение ввода от пользователя, фильтрация 3х символов

  2. Формирование сетевого запроса для сервера и отправка запроса

  3. Расшифровка ответа

  4. Вывод результатов, сохраняя данные в переменную

В объектно-ориентированном императивном подходе на базе MVC у ViewController будет примерно так(Написал из головы):

Swift Combine - Часть 1 / 5 min IT, Дневник, Научпоп, Swift, Программирование, Длиннопост

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

Swift Combine - Часть 1 / 5 min IT, Дневник, Научпоп, Swift, Программирование, Длиннопост

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

В целом плюсы реактивного подхода:

  1. Однозначность обработки положительных и отрицательных исходов

  2. Фильтрация событий по времени. В примере из всех вводов пользователя за 0.3 секунды будет взят последний

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

  4. Удобная связка со SwiftUI и Async благодаря тому, что Combine - часть языка, а не внешняя библиотека. Большая часть системных операций и UI также готова к работе с Combine

Источники данных и потребители

Эту тему я рассмотрю подробнее в будущей статье, но кратко опишу.

В Combine источники данных - это Publisher и дочерние типы. У основных системных вызовов, например у сетевых инструментов, SwiftUI и др. есть ответы и события в формате Publisher.

Результат работы можно назначить в свойство через метод assign или обработать как callback в методе sink. Они возвращают объект Cancellable, который надо сохрнить в переменной напрямую или через метод store, иначе память освободится и обработчик не будет работать.

Песочница для реактивных операций

Swift Combine - Часть 1 / 5 min IT, Дневник, Научпоп, Swift, Программирование, Длиннопост

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

Песочница доступа в Github со всеми примерами, включая будущие статьи

Операции и преобразования

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

У некоторых операций есть try... вариант, который позволяет вернуть ошибку, но я их дополнительно не описывал.

Mapping

Swift Combine - Часть 1 / 5 min IT, Дневник, Научпоп, Swift, Программирование, Длиннопост

Код примеров

  • .map - преобразование данных, количество на входе равно количеству на выходе. Можно вернуть объект того же типа или поменять тип. Аналогично методу map массива. В примере звезды заменяются треугольниками.

  • .mapError - преобразование ошибок, ошибка на входе - ошибка на выходе. Позволяет свести все ошибки к одному типу для обработки в конце. Обработка в блоке. В примере ошибка меняется на зеленую ошибку.

  • .replaceNil - замена nil на фиксированный объект. В примере nil заменяется оранжевой звездой

  • .scan - похоже на map, но результат передается как второй параметр в блок обработки. На первый шаг подается первый аргумент вызова scan. В примере подается объект-образец, в цвет которого будут покрашены все элементы

  • .setFailureType - позволяет поменять тип ошибки для синхронизации типов. Never поменять на свой тип. В примере в коде сначала ошибка приводится к Never с помощью Catch, а затем обратно к DemoError с помощью setFailureType.

  • .map Keypath - аналогично map, но можно передать 1 keypath, чтобы получить на выходе значение. Если передать 2 или 3 keypath, будет tuple. В примере 1 keypath .color используется для создания результатов, а в примере 2 .color и .icon используются для создания копий в результатах

Filtering

Swift Combine - Часть 1 / 5 min IT, Дневник, Научпоп, Swift, Программирование, Длиннопост

Код примеров

  • .filter - аналогично методу над массивом, возвращает только подходящие элементы. В примере не пропускает треугольники

  • .compactMap - аналгично map, но nil пропускается. В примере для сравнения map и compactMap на тех же данных

  • .removeDuplicates - удаляет одинаковые, идущие подряд элементы. Для этого они должны соответствовать протоколу Equitable. В примере синий и синяя звезда - разные.

  • .removeDuplicates(by: ) - удаляет одинаковые, идущие подряд элементы, определяя "одинаковость" в блоке. В примере одинаковость определяется оп цвету, В примере синий и синяя звезда - одно и то же.

  • .replaceEmpty - если поток закончился и ничего не вернул, то можно задать какое-то значение. В примере 1 возвращается оранжевый, а во втором были данные - возвращаются они

  • .replaceError - возвращает определенные данные, если была ошибка. В отличие от catch нет возможности обработать ошибку, она заменяется одним значением на входе

Reducing

Swift Combine - Часть 1 / 5 min IT, Дневник, Научпоп, Swift, Программирование, Длиннопост

Код примеров

  • .collect - собирает объекты в массив. В примере три цветных объекта становится одним массивом

  • .collect(n) - собирает объекты в массив по несколько штук. В примере 6 объектов собираются в две кучки по три. В примере два в кучки 4 и 2

  • .collect(.byTime ) - собирает объекты по несколько штук, пришедших в указанный интервал

  • .collect(.byTimeOrCount ) - также собирает объекты по несколько штук за указанный интервал, но не больше указанного количества

  • .ignoreOutput - гинорирует то, что было в выдаче. Вернет только сигнал окончания потока или ошибку

  • .reduce - работет как scan, но на выходе будет только 1 объект, последний. В примере суммируются числа на объектах

Заключение

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

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

Все работающие примеры preview есть в проекте на Github, их можно скачать и запустить.

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

Показать полностью 6
[моё] IT Дневник Научпоп Swift Программирование Длиннопост
0
4
andrey.zarembo
andrey.zarembo
1 год назад
Серия Дневник разработчика

Галерея фотографий / 5min⁠⁠

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

Галерея фотографий / 5min IT, Дневник, Научпоп, Swift, Программирование, Длиннопост, Видео, Без звука

В этой статье вы прочитаете:

  • Как создать фото-галерею

  • Как реализовать выбор фотографий

  • Как сделать переключение размера фото

Примеры изображений и кода из этой статьи доступны на GitHub

Как создать фото-галерею

Чтобы создать фото-галерею необходимо 3 компонента:

  1. Источник фотографий

  2. Шаблон фотографии

  3. Лента для вывода фотографий

Источник фотографий

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

💡 Добавление/удаление фотографий будет описано в одной из будущих статей

Сами фотографии могут загружаться через Core Data, Swift Data, из сети по API. Мой проект использует Realm. Для примера приложение будет загружать фотографии из временной папку, куда будут скопированы ресурсы.

Источник фотографий - это объект типа ObservableObject - специальный тип объекта, который при изменении свойств, помеченных как published будет вызывать обновление состояния View.

Потребуется два таких:

  1. Массив фотографий

  2. Состояние активной загрузки

У загрузки будет три состояния:

  • Есть контент для загрузки

  • Активная загрузка

  • Все загружено

Галерея фотографий / 5min IT, Дневник, Научпоп, Swift, Программирование, Длиннопост, Видео, Без звука

Код примера выше

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

Галерея фотографий / 5min IT, Дневник, Научпоп, Swift, Программирование, Длиннопост, Видео, Без звука

Код примера выше

Загрузка фотографий

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

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

💡 Это позволит переключаться между разными хранилищами, я использую Realm и отладочные хранилища с разными фотографиями.

Сам метод loadMore будет выставлять режим загрузки, получать новые фотографии и анализировать. Если пусто, то будет выставляться режим done, иначе - hasMore

Галерея фотографий / 5min IT, Дневник, Научпоп, Swift, Программирование, Длиннопост, Видео, Без звука

Код примера выше

💡Здесь нет обработки ошибок, чтобы не загромождать пример

Автоматическая загрузка

Автоматическая загрузка будет осуществляться аналогично примеру с исчезающими боковыми кнопками. Потребуется два GeometryReader:

  • Один будет определять высоту контейнера галереи

  • Другой будет следить за расстоянием верха загруженных фотографий от края

Галерея фотографий / 5min IT, Дневник, Научпоп, Swift, Программирование, Длиннопост, Видео, Без звука

Разница этих двух значений больше нуля будет означать, что нижняя граница фотографий находится выше нижнего края экрана. Если при этом галерея находится в режиме hasMore, можно загрузить ещё фотографий.

Галерея фотографий / 5min IT, Дневник, Научпоп, Swift, Программирование, Длиннопост, Видео, Без звука

Код примера выше

Шаблон фотографии

Шаблон фотографии - это ZStack, в котором будет находиться изображение, а также в углах будут находиться индикаторы для выбора фото и качества фотографии

Галерея фотографий / 5min IT, Дневник, Научпоп, Swift, Программирование, Длиннопост, Видео, Без звука

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

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

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

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

Галерея фотографий / 5min IT, Дневник, Научпоп, Swift, Программирование, Длиннопост, Видео, Без звука

Код примера выше

Лента для вывода фотографий

Для отображения галереи потребуется ScrollView, внутри которого будут LazyVGrid и индикатор загрузки. Внутри галереи фотографии будут выводиться через ForEach для массива.

Необходимо добавить GeometryReader для определения размера фотографии.

Галерея фотографий / 5min IT, Дневник, Научпоп, Swift, Программирование, Длиннопост, Видео, Без звука

Код примера выше

Как реализовать выбор фотографий

Для выбора фото необходимо создать массив с ID фотографий. Галерея будет проверять наличие ID фотографии в этом массиве и выставлять флаг Selected. Нажатие на фотографию буде добавлять и удалять ID в массив.

Галерея фотографий / 5min IT, Дневник, Научпоп, Swift, Программирование, Длиннопост, Видео, Без звука

Код примера выше

💡 Кнопка выбора фотографии добавляется как overlay. Чтобы она была прозрачной в её label добавляется Color.clear, но для того, чтобы её можно было нажать, необходимо ей задать "тело" прямоугольной формы с помощью contentShape и clipShape

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

Как сделать переключение размера фото

В галерее будет три режима вывода фотографии, мелкие, средние и крупные фотографии. Если взять средний iPhone, например 14, то на экране будет 5, 3 и 1 соответственно. Конечно выводить в ленте по 1 фото на экран iPad Pro будет слишком, поэтому на планшетах будет примерно такой же размер фотографий.

Галерея фотографий / 5min IT, Дневник, Научпоп, Swift, Программирование, Длиннопост, Видео, Без звука

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

Галерея фотографий / 5min IT, Дневник, Научпоп, Swift, Программирование, Длиннопост, Видео, Без звука

Код примера выше

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

Галерея фотографий / 5min IT, Дневник, Научпоп, Swift, Программирование, Длиннопост, Видео, Без звука

Код примера выше

Выглядеть и работать переключение будет так

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

Заключение

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

Все работающие примеры есть в проекте на Github, их можно скачать и запустить.

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

Показать полностью 12 1
[моё] IT Дневник Научпоп Swift Программирование Длиннопост Видео Без звука
2
7
andrey.zarembo
andrey.zarembo
1 год назад
Серия Дневник разработчика

SwiftUI View Builder / 4 min⁠⁠

В этой статье я расскажу про то, как работает создание интерфейса в SwiftUI при помощи ViewBuilder

SwiftUI View Builder / 4 min IT, Дневник, Научпоп, Swift, Программирование, Длиннопост

В этой статье вы прочитаете:

  • Почему у ViewBuilder такой формат

  • Как создать свой контейнер для View

  • 3 способа преобразовать результат ViewBuilder в массив

Примеры изображений и кода из этой статьи доступны на GitHub

Почему у ViewBuilder такой формат

Если посмотреть на протокол View, то видно, что body - это переменная, которая возвращает объект, реализующий протокол View, который должен в итоге получить конкретный тип. И следующий код будет прекрасно работать. Следующий код будет работать

SwiftUI View Builder / 4 min IT, Дневник, Научпоп, Swift, Программирование, Длиннопост

Код примера выше

Но Apple стремится упростить синтаксис для SwiftUI, поэтому у body есть два префикса - ViewBuilder и MainActor.

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

На выходе создается объект типа AnyView<TupleView<(...)>>. Т.е. следующие два блока кода эквивалентны

SwiftUI View Builder / 4 min IT, Дневник, Научпоп, Swift, Программирование, Длиннопост

Код примера выше

Как создать свой контейнер для View

Для того, чтобы создать вертикальный стек с общим стилем элементов, который можно переиспользовать(с фоном, границей, тенью) можно создать свой контейнер и применить стили ко всем внутренним элементам, включая Spacer

Для этого необходимо объявить Generic структуру, в которой параметром шаблона будет Content типа View. Необходимо объявить свойство content с типом ViewBuilder, которое будет блоком-фабрикой.

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

SwiftUI View Builder / 4 min IT, Дневник, Научпоп, Swift, Программирование, Длиннопост

Код примера выше

Также Group можно использовать, чтобы применить какой-то стиль к View, созданному по условию

SwiftUI View Builder / 4 min IT, Дневник, Научпоп, Swift, Программирование, Длиннопост

ViewExtractor и как преобразовать содержимое ViewBuilder в массив

Увы, способ выше не позволяет каким-то образом изменить порядок дочерних элементов, добавить между ними какие-то объекты или использовать какое-то форматирование, зависящее от количества элементов.

Первый путь

Библиотека ViewExtractor. Она дает достаточно простой синтаксис

SwiftUI View Builder / 4 min IT, Дневник, Научпоп, Swift, Программирование, Длиннопост

В ней используется тайное знание о том, как устроен SwiftUI, _VariadicView.Tree хранит к себе элементы из ViewBuilder. Но это использование приватного API и Apple может заблокировать такое приложение или оно может сломаться после обновления операционной ситсемы.

Второй путь

Манипуляции c памятью в расширении над ExtensionView. Суть в том, чтобы взять из TupleView дочерние объекты и сказать, что эта область памяти - массив.

SwiftUI View Builder / 4 min IT, Дневник, Научпоп, Swift, Программирование, Длиннопост

Код примера выше

Но Mirror работает не очень быстро, т.к. отключает часть оптимизаций на объекте, чтобы добраться до его элементов. А withUnsafeBytes может обрушить приложение, если в будущей версии iOS изменится структура хранения в памяти.

SwiftUI View Builder / 4 min IT, Дневник, Научпоп, Swift, Программирование, Длиннопост

Код примера выше

Из-за того, что ViewBuilder все оборачивает в AnyView, content[index] не сможет использоваться для сравнения типа, но index и количество объектов позволяют добавить разделители, если необходимо.

Третий путь

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

Плюсы

  • Можно сортировать и фильтровать объекты

  • Сохраняется информация о типах и можно изменять отдельные параметры

  • Доступен индекс объекта и их количество

Минусы

  • Синтаксис требует квадратных скобок и запятых

  • Каждый класс должен соответствовать протоколу через extension

  • Иногда ломается компилятор и выдает не ту ошибку, которая случилась

SwiftUI View Builder / 4 min IT, Дневник, Научпоп, Swift, Программирование, Длиннопост

Код примера выше

Придется отказаться от синтаксиса ViewBuilder, но такой способ не отвалится внезапно от обновления iOS и даст возможность сортировать и фильтровать объекты, а также обращаться к их типам.

SwiftUI View Builder / 4 min IT, Дневник, Научпоп, Swift, Программирование, Длиннопост

Код примера выше

Заключение

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

Все работающие примеры preview есть в проекте на Github, их можно скачать и запустить.

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

Показать полностью 9
[моё] IT Дневник Научпоп Swift Программирование Длиннопост
0
Посты не найдены
О нас
О Пикабу Контакты Реклама Сообщить об ошибке Сообщить о нарушении законодательства Отзывы и предложения Новости Пикабу Мобильное приложение RSS
Информация
Помощь Кодекс Пикабу Команда Пикабу Конфиденциальность Правила соцсети О рекомендациях О компании
Наши проекты
Блоги Работа Промокоды Игры Курсы
Партнёры
Промокоды Биг Гик Промокоды Lamoda Промокоды Мвидео Промокоды Яндекс Директ Промокоды Отелло Промокоды Aroma Butik Промокоды Яндекс Путешествия Постила Футбол сегодня
На информационном ресурсе Pikabu.ru применяются рекомендательные технологии