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
- Host: GitHub
- URL: https://github.com/surfstudio/ios-tech-task-weather-app-swiftui
- Owner: surfstudio
- Created: 2020-10-15T06:46:20.000Z (almost 5 years ago)
- Default Branch: master
- Last Pushed: 2020-10-20T12:18:59.000Z (almost 5 years ago)
- Last Synced: 2025-01-25T22:58:07.492Z (9 months ago)
- Topics: hacktoberfest
- Language: Swift
- Homepage:
- Size: 49.6 MB
- Stars: 2
- Watchers: 25
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# Weather App

Репозиторий содержит приложение для просмтора погоды. Фичи:
- При первом в ходе в список городов добавляется Минск и Москва
- При входе в приложение пользователь попадает на детальный экран погоды по его локации
- Из детального экрана можно попасть на список городов
- В писке можно выбрать другой город для детального просмотра
- В списке можно удалить город нажав "Изменить"
- В спсике можно доабвить новый город
- В поиске работают подсказки
- При выборе города из поиска он автоматически добавляется в БД и пользователь попадает на детальный экран этого города
- Кеширование данных с 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
```