iOS app for learning a foreign language with word cards
Flashspeak
Приложение iOS для изучения иностранных слов по наборам карточек.
Содержание
Начало
Мы небольшая команда начинающих разработчиков, которых объеденяет школа IT GeekBrains. В рамках финального курса, нам предстояло создать приложение. Перед стартом написания, мы поставили перед собой следующие задачи:
- Научиться работать в команде при раработке продукта
- Научиться организовывать работу используя Task Manager
- Придумать проект, который мы в силах раработать
- Сформировать техническое описание
- Создать дизайн приложения
- Написать приложение
- Оформить ReadMe в репозитории
В итоге у нас получилось приложение, обзор ниже.
Обзор
Создание списка | Обучение | Список слов |
---|---|---|
List.mov
|
LearnReview.mov
|
WardCardsReview.mov
|
Возможности
Пользователь, выбрав язык изучения, может легко создать свой список слов для изучения. Слова можно добавить через вставку или вводя по отдельности. Приложение сформирует перевод и найдет подходящие изображения для каждого слова. Пользователь на главноем экране увидит новый список. По нажатию на него, можно просмотреть получившиеся карточки, а если перевод и подобранное изображение не подойдут то можно загрузить свое изображение или изменить перевод слова. Изучение можно проходить по различным сценариям. Карточку для изучения можно сделать из частей: исходное слово, перевод и изображение. Отвечать на предложенную карточку можно через тестирование или набирая ответ на клавиатуре. Для понимания звучания, есть кнопка произнести слово вслух. Результаты прохождения каждого изучения списка сохранаются и формируются в статистику, так же пользователю будут показаны ошибки для работы над ними.
Выбор языка
При первом открытии приложения, пользователь видит экран приветствия. Приложение просит выбрать родной язык и изучаемый. По кнопке “Начать” сценарий первого старта заканчивается и открывается основной экран со списками слов1.
Списки слов
Это главный экран, который пользователь будет видеть при последующих запусках приложения. Изначально экран пустой. Чтобы показать пользователю что делать дальше, показывается стрелочка, которая указывает на кнопку создания списка “+”. После создания списка, пользователь может его увидеть на главном экране. При длительном нажатии на ячейку списка или по кнопке в верхнем правом углу, открывается меню для управления списком слов1. Если пользователь решит изучать другой язык, то он может сменить его по кнопке с изображением флага в верхнем правом углу экрана2.
Создание и редактирование списка слов
Создание списка начинается по кнопке “+” на главном экране списоков. По нажатию, открыватся модальное окно с полями для названия, выбора цвета для ориентации и переключателем изображний для слов. По нажатию на “Создать список”, пользователь попадает на экран набора слов. Экран позволяет создавать и редактировать слова, на нем есть всего три элемента: поле для ввода, кнопка создания и кнопка помощи. Слова можно вводить набирая с клавиатуры, а также вставлять уже готовый список слов, которые отделены символом запятой или переходом строки. Чтобы сориентировать пользователя, есть кнопка с вопросом, которая открывает окно с описанием возможностей. У списка есть минимальные требования колличества слов, подсказки с этой информацией отображается на кнопке в процессе набора слов. Для добавления в список слова, можно использовать кнопку Enter, запятую или кнопку +, которая появляется справа от поля в момент начала ввода слова. Чтобы удалить или исправить уже введенное слово необходимо удерживать его пару секунд, активируются поле удаления и редактирования. Пользователю необходимо перенести слово в нужное поле. Если пользователь не нажмет на кнопку создать карточки и захочет вернуться на предыдущий экран, то приложение предложит два варианта: выйти без сохранения или вернуться, чтобы не потерять созданный список12.
Просмотр карточек
После создания списка слов, открывается экран с карточками. На нем можно просматривать карточки вместе с картинками, есть возможность редактировать или удалять. Отредактировать весь список слов можно по кругой кнопке справа внизу. На экран можно попасть по меню с главного экрана и в обзорном экране перед изучением3. Название и стиль списка можно сменить по нажатию на интуитивную кнопку в панели навигации.
Редактирование карточки
Экран выполняет функцию редактирования карточки. Если сервис подобрал не верный перевод, то его можно изменить. А если не подходящее изображение, то сервис в карусели предлагает на выбор другие фотографии. Пролистав и выбрав нужное изображение в карусели, над карточкой меняется заглавный баннер. Последняя ячейка карусели является кнопкой, которая дает возможность загрузить свое изображение из галереи устройства. По нажатию на кнопку сохранить, карточка обновляется1.
Изучение
Перед запуском изучения, пользовтелю предлагается выбрать индивидуальные настройки карточки слова и функции редактирования списока. По нажатию на кнопку настроек, открывается меню, где можно выбрать отображение вопроса и способ ответа. Экран создается по паттерну Strategy. За сохранение ответов пользователя отвечает Caretaker, который потом дает данные для экрана статистики и работы над ошибками1.
Результаты изучения
После каждого прохождения изучения, открывается экран результатов. Он состоит из двух частей: статистика и допущенные ошибки. Есть возможность пройти изучение снова по кнопке “Повторить”1.
Темное оформление
Приложение поддерживает автоматическое переключение режима оформления.
Реализация
Task Manager
Для работы мы используем сервис Weeek. Метод организации нашей работы – Scrum, задачи ведем в канбан досках.
API
Используются API сервисы для перевода и изображений. Сервис запроса в сеть написан с использованием Combine и Generic для переиспользования при получении различных типов данных: перевода или изображений к переводу4.
Flashspeak/FlashSpeak/FlashSpeak/Core/Extensions/URLSession.swift
Lines 13 to 43 in 800b2dc
Так же будет легко заменить API при проблемах на стороне сервиса.
Flashspeak/FlashSpeak/FlashSpeak/Service/NetworkService.swift
Lines 19 to 42 in 800b2dc
Перевод
Перевод осуществялется силами Google. Приложение отправляет список слов и получает ответ в виде переведенного списка1.
Изображения
Подбор изображений осуществляет сервис Unsplash. Приложение отправляет ключевое слово и код языка, а ответ приходит в виде ссылок на изображения. Сервис не всегда присылает подходящие фотографии, поэтому в будущем он заменится на альтернативный, это будет лего сделать, так как сетевой слой написан универсально с использованием generic функции41. Хранятся изображения в виде ссылок. При загрузке фотографий используется cache, а индивидуальные фотографии пользователя для карточек сохраняются в папку приложения1.
Архитектура
Используется ModelViewPresenter. Архитектура удобна в командной работе над проектом.
Паттерны
Delegate
Использован для обмена данными и событиями между view
Strategy
Паттерн отлично подошел при создании различных отображений карт в уроке. Пользователь может настроит карточку в настройках, а приложение создает для карты нужное view1.
Еще паттерн используется при формировании очереди вопросов для урока, согласно выбранным настройкам1.
Caretaker
Во вермя урока, есть много данных, а именно: ответы, ошибки, время. Их надо обработать, избавив классы от перегрузки кодом. Эту задачу сбора и сохранения во время прохождения урока берет на себя сaretaker1.
Singleton
Используется для создания одного класса для менеджеров, которые обслуживают классы в различных частях приложения. Их несколько: менеджер базы данных, менеджер кеша изображений и другие.
Coordinator
Нужен для координации окон приложения. Так как мы отказалист от классических storyboard, которые при одноверменной работе вызывают ошибки и конфликты, то наиболее удобное решение – это Coordinator.1
Flashspeak/FlashSpeak/FlashSpeak/Coordinator/Coordinator.swift
Lines 11 to 29 in 800b2dc
Router
События переходов в окнах описываются в едином файле router, который имеет closure для сообщения координатору события. Данные передаются через case в enum событиях.
Builder
Для создания комплекта файлов каждого окна, нужен builder. В нем можно настроить архитектуру и связи между делегатом и делегатами, передать данные.
Библиотеки
UIKit
Для написания интерфейса приложения выбрана классическая библиотека.
SwiftUI
Используется для отрисовки графиков результатов, потому что имеет встроенную библиотеку Chart. Код встаивания через UIHostController
Код графика
CoreData
Хранение данных реализованно встроенной библиотекой. Она быстрая, не прибавляет веса приложению и покрывает задачи работы с данными.
Combine
Использование реактивного програмирования позволило уменьшить колличество делегатов и кода для связи объектов между друг другом.
AVFoundation
Озвучивание иностранного слова полезно для обучения языку. По нажатию на кнопку speaker в уроке, слово синтезируется речь использую эту библиотеку.
Flashspeak/FlashSpeak/FlashSpeak/Core/Learn/Manager/LearnManager.swift
Lines 260 to 282 in 800b2dc
Хранение данных
- CoreData3
-
UserDefaults3 Хранит значения ключей настроек обучения, профиля пользователя,
-
Config.xcconfig4 Хранит токены для API. Файл внесен в gitignore, чтоб токены не утекли в сеть.
Требования
- iOS 16.0+
- Xcode 14.3
Как запустить
Для запуска приложения, нужно внести токены API в Config.xcconfig.
Зачем
Проект создан в рамках курса “Командная разработка на Swift” в школе GeekBrains. Преподаватель курса Александр Рубцов.
To Do
- Добавить интерактивный виджет урок
- Добавить трансфер списка слов на другой язык
- Сделать экран настроек приложения
- Сделать несколько списков слов по умолчанию при первом открытии приложения
- Добавить возможность сменить язык в приложении
- Заменить сервис изображений
- Добавить графики для отображения статистики
Команда проекта
Сноски на реализованные части