An open API service indexing awesome lists of open source software.

https://github.com/surfstudio/ios-tech-task-weather-app-swiftui


https://github.com/surfstudio/ios-tech-task-weather-app-swiftui

hacktoberfest

Last synced: 7 months ago
JSON representation

Awesome Lists containing this project

README

          

# Weather App

![](example.gif)

Репозиторий содержит приложение для просмтора погоды. Фичи:
- При первом в ходе в список городов добавляется Минск и Москва
- При входе в приложение пользователь попадает на детальный экран погоды по его локации
- Из детального экрана можно попасть на список городов
- В писке можно выбрать другой город для детального просмотра
- В списке можно удалить город нажав "Изменить"
- В спсике можно доабвить новый город
- В поиске работают подсказки
- При выборе города из поиска он автоматически добавляется в БД и пользователь попадает на детальный экран этого города
- Кеширование данных с TTL = 3 часа. То есть спустя 3 часа данные обновляются при необходимости. То есть обновится только то, что "протухло"

## Что использовалось

[Сервис данных о погоде](https://openweathermap.org)
[Сервис геокодинга](https://rapidapi.com/GeocodeSupport/api/forward-reverse-geocoding)

В качестве БД использовалась CoreData

## Структура проекта

### Appliaction

Содержит все что касается в целом приложения и его запуска

### Flows

Содержат экраны. Каждый экран представлен набором:
- Configurator - для того чтоб инжектить зависимости
- Presenter - поставщик данных во View
- View - для отображения данных

[Более подробнее об архитектуре](https://github.com/surfstudio/Surf-iOS-Developers/blob/master/architectures/Surf_MVP_Coordinators.md)

### Library

Содержит переиспользуемые компоненты или утилиты которые используются по всему приложению

#### Styles

Содержитс тили для UI-компонентов. Стиль должен инкапсулировать конфигурацию внешнего вида компонента. Стили применяются только для примитивов.

##### UILabel

Именование стилей лейбла производится в формате `FontWeightSizeColorAlignment`.
Пример для шрифта `Montserrat` с весом `Semibold` размера `48` цвета `textGrey` с выравниванием по центру – `MS48TextGreyCenter`.
Для шрифтов `SF Pro Text` и `SF Pro Display` использовать первую букву последнего слова `T` и `D` соответственно, чтобы не усложнять запись.

##### UIСontrol, UIView

Название берется из `Figma` из раздела `UI Kit`. Например, для кнопки со скрина стиль должен называться `mainActive`, если конфигурация стиля происходит только для одного состояния. В случае конфигурации всех состояния в одном стиле, стиль должен называться `main`.

Если названия нет в `Figma` проверить, есть ли такой реюзный компонент в проекте, возможно он уже сконфигурирован под ваш кейс.

Если нет названия в `Figma` и нет реюзного компонента, то необходимо попросить дизайнеров назвать этот объект.

Если это не реюзный компонент, то называть по кейсу использования.

##### Работа с цветами

Цвета в проекте работают через `Assets`. При создании нового цвета необходимо в `Assets` перейти в папку `Color` и добавить новый цвет. Например, для цвета со скрина необходимо создать новый цвет и назвать его `lightBlue`.

Если у элемента есть `opacity` и нет названия цвета, то можно использовать уже существующее название и добавить к нему `opacity`. Например, для черного цвета с прозрачностью 70%, необходимо создать цвет `black70`.

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

##### Работа с изображениями

Изображения в проекте работают через `Assets`. При создании нового изображения необходимо в `Assets` перейти в папку `Image` и добавить новое изображение. Изображения стоит разделять на директории в соответсвии с элементами, для которого они используются. Например, для элемента `RadioButton` необходимо создать директории `RadioButton` и поместить изображения `radioButtonOn` и `radioButtonOff` в эту директорию.

При создании новой директории необходимо проставить галочку `Provides Name Space`.

Изображения добавляем в проект в формате `PDF`.

При добавлении изображения необходимо проставить `Scales = Single scale` и галочку `Preserve Vector Data`.

### Models

Содержит 3 слоя моделей

**Entry** - модели для парсинга днных пришедших от сервера. Четко отражают модели данных сервера
**Entity** - бизнес-сущности. Часть похожи на серверные модели, однако могут содержать логику форматирования и прочую логику ограниченную доменным контекстом
**Cache** - модели для БД. Повторяют **Entity** модели

### Resources

Ресурсы приложения - ассеты, строки, шрифты e.t.c

### Services

Содержит сервисы для работы с источниками данных. Сами по себе сервисы могут быть использвоаны в презентерах, однако иногда несколько сервисов инкапсулируются репозиторием - `CityRepo` который и реализует логику кеширования. Более подробне можно прочесть в комментариях.

`CityRepo` покрыт тестами, доказявающими, что он работает так как от него ожидается.

### ThirdParty

Содержит расширения библиотечных компонентов

## Как собрать

```shell
make init # Подтянет все ruby-зависимости и все pod-ы
make pbxprodj # Создасть .pbxprodj - используется XCodeGen
open Weather.xcworkspace
```