{"id":21748360,"url":"https://github.com/surfstudio/ios-tech-task-weather-app-swiftui","last_synced_at":"2026-05-16T21:33:41.679Z","repository":{"id":71210858,"uuid":"304234715","full_name":"surfstudio/iOS-tech-task-weather-app-swiftUI","owner":"surfstudio","description":null,"archived":false,"fork":false,"pushed_at":"2020-10-20T12:18:59.000Z","size":51969,"stargazers_count":2,"open_issues_count":0,"forks_count":1,"subscribers_count":24,"default_branch":"master","last_synced_at":"2025-03-21T02:25:09.633Z","etag":null,"topics":["hacktoberfest"],"latest_commit_sha":null,"homepage":"","language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/surfstudio.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-10-15T06:46:20.000Z","updated_at":"2022-04-05T13:02:54.000Z","dependencies_parsed_at":null,"dependency_job_id":"a2a02718-06b6-4922-9fe7-6034b05f1977","html_url":"https://github.com/surfstudio/iOS-tech-task-weather-app-swiftUI","commit_stats":null,"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/surfstudio/iOS-tech-task-weather-app-swiftUI","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/surfstudio%2FiOS-tech-task-weather-app-swiftUI","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/surfstudio%2FiOS-tech-task-weather-app-swiftUI/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/surfstudio%2FiOS-tech-task-weather-app-swiftUI/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/surfstudio%2FiOS-tech-task-weather-app-swiftUI/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/surfstudio","download_url":"https://codeload.github.com/surfstudio/iOS-tech-task-weather-app-swiftUI/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/surfstudio%2FiOS-tech-task-weather-app-swiftUI/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33119448,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-16T18:38:32.183Z","status":"ssl_error","status_checked_at":"2026-05-16T18:38:29.903Z","response_time":115,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["hacktoberfest"],"created_at":"2024-11-26T08:13:11.802Z","updated_at":"2026-05-16T21:33:41.663Z","avatar_url":"https://github.com/surfstudio.png","language":"Swift","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Weather App\n\n![](example.gif)\n\nРепозиторий содержит приложение для просмтора погоды. Фичи:\n- При первом в ходе в список городов добавляется Минск и Москва\n- При входе в приложение пользователь попадает на детальный экран погоды по его локации\n- Из детального экрана можно попасть на список городов\n- В писке можно выбрать другой город для детального просмотра\n- В списке можно удалить город нажав \"Изменить\"\n- В спсике можно доабвить новый город\n- В поиске работают подсказки\n- При выборе города из поиска он автоматически добавляется в БД и пользователь попадает на детальный экран этого города\n- Кеширование данных с TTL = 3 часа. То есть спустя 3 часа данные обновляются при необходимости. То есть обновится только то, что \"протухло\"\n\n## Что использовалось\n\n[Сервис данных о погоде](https://openweathermap.org)\n[Сервис геокодинга](https://rapidapi.com/GeocodeSupport/api/forward-reverse-geocoding)\n\nВ качестве БД использовалась CoreData\n\n## Структура проекта\n\n### Appliaction\n\nСодержит все что касается в целом приложения и его запуска\n\n### Flows\n\nСодержат экраны. Каждый экран представлен набором:\n- Configurator - для того чтоб инжектить зависимости\n- Presenter - поставщик данных во View\n- View - для отображения данных\n\n[Более подробнее об архитектуре](https://github.com/surfstudio/Surf-iOS-Developers/blob/master/architectures/Surf_MVP_Coordinators.md)\n\n### Library\n\nСодержит переиспользуемые компоненты или утилиты которые используются по всему приложению\n\n#### Styles\n\nСодержитс тили для UI-компонентов. Стиль должен инкапсулировать конфигурацию внешнего вида компонента. Стили применяются только для примитивов. \n\n##### UILabel\n\nИменование стилей лейбла производится в формате `FontWeightSizeColorAlignment`. \nПример для шрифта `Montserrat` с весом `Semibold` размера `48` цвета `textGrey` с выравниванием по центру – `MS48TextGreyCenter`.\nДля шрифтов `SF Pro Text` и `SF Pro Display` использовать первую букву последнего слова `T` и `D` соответственно, чтобы не усложнять запись.\n\n##### UIСontrol, UIView\n\nНазвание берется из `Figma` из раздела `UI Kit`. Например, для кнопки со скрина стиль должен называться `mainActive`, если конфигурация стиля происходит только для одного состояния. В случае конфигурации всех состояния в одном стиле, стиль должен называться `main`.\n\nЕсли названия нет в `Figma` проверить, есть ли такой реюзный компонент в проекте, возможно он уже сконфигурирован под ваш кейс.\n\nЕсли нет названия в `Figma` и нет реюзного компонента, то необходимо попросить дизайнеров назвать этот объект.\n\nЕсли это не реюзный компонент, то называть по кейсу использования.\n\n##### Работа с цветами\n\nЦвета в проекте работают через `Assets`. При создании нового цвета необходимо в `Assets` перейти в папку `Color` и добавить новый цвет. Например, для цвета со скрина необходимо создать новый цвет и назвать его `lightBlue`.\n\nЕсли у элемента есть `opacity` и нет названия цвета, то можно использовать уже существующее название и добавить к нему `opacity`. Например, для черного цвета с прозрачностью 70%, необходимо создать цвет `black70`.\n\nЕсли у какого-то цвета нет названия и он не является производным базового с другой прозрачностью, необходимо написать в чат дизайнерам, чтобы они добавили название.\n\n##### Работа с изображениями\n\nИзображения в проекте работают через `Assets`. При создании нового изображения необходимо в `Assets` перейти в папку `Image` и добавить новое изображение. Изображения стоит разделять на директории в соответсвии с элементами, для которого они используются. Например, для элемента `RadioButton` необходимо создать директории `RadioButton` и поместить изображения `radioButtonOn` и `radioButtonOff` в эту директорию.\n\nПри создании новой директории необходимо проставить галочку `Provides Name Space`.\n\nИзображения добавляем в проект в формате `PDF`.\n\nПри добавлении изображения необходимо проставить `Scales = Single scale` и галочку `Preserve Vector Data`.\n\n### Models\n\nСодержит 3 слоя моделей\n\n**Entry** - модели для парсинга днных пришедших от сервера. Четко отражают модели данных сервера\n**Entity** - бизнес-сущности. Часть похожи на серверные модели, однако могут содержать логику форматирования и прочую логику ограниченную доменным контекстом\n**Cache** - модели для БД. Повторяют **Entity** модели\n\n### Resources\n\nРесурсы приложения - ассеты, строки, шрифты e.t.c\n\n### Services\n\nСодержит сервисы для работы с источниками данных. Сами по себе сервисы могут быть использвоаны в презентерах, однако иногда несколько сервисов инкапсулируются репозиторием - `CityRepo` который и реализует логику кеширования. Более подробне можно прочесть в комментариях. \n\n`CityRepo` покрыт тестами, доказявающими, что он работает так как от него ожидается. \n\n### ThirdParty\n\nСодержит расширения библиотечных компонентов\n\n## Как собрать\n\n```shell\nmake init # Подтянет все ruby-зависимости и все pod-ы\nmake pbxprodj # Создасть .pbxprodj - используется XCodeGen\nopen Weather.xcworkspace\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsurfstudio%2Fios-tech-task-weather-app-swiftui","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsurfstudio%2Fios-tech-task-weather-app-swiftui","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsurfstudio%2Fios-tech-task-weather-app-swiftui/lists"}