Курсы валют и конвертер цен
Приложение iOS для просмотра валютных курсов и конвертации цен. Состоит из двух вкладок. На первой можно получить курс выбранной валюты в других. На второй можно конвертировать цены между двумя валютами.
Для выбора нужного курса, нужно ввести код валюты в панели и список автоматически покажется ниже.
Чтоб было проще ориентироваться, есть фильтр списка валют. Нажав кнопку фильтр и выделив нужные коды, список обновится и сервис покажет выбранные.
Над таблицей курсов есть таймер, который показывает давность полученных даных.
Реализует это сервис Exchange Rate API https://api.exchangerate.host/latest?base=rub
Пользователь вводит коды валют и цену в левой валюте. Далее происходит автоматическая конвертация цены и результат выводит под введеной ценой. Реализует это сервис Exchange Rate API https://api.exchangerate.host/convert?from=USD&to=EUR&amount=1
Под результатом приводится график динамики курса этих валют.
Интерфейс написан на SwiftUI, он легко обноляемый при использовании предикатов.
Для сервиса полкчения данных используется Exchange Rate API.
|
private enum Method { |
|
///Последние базовые курсы обмена, обновляемые ежедневно. |
|
///https://api.exchangerate.host/latest?base=rub |
|
case rates(base: String) |
|
///Конвертации любой суммы из одной валюты в другую. |
|
///https://api.exchangerate.host/convert?from=USD&to=EUR&amount=1 |
|
case convert(from: String, to: String, amount: Double) |
|
///Получить информацию о том, как валюты колеблются изо дня в день. Максимально допустимое время составляет 366 дней. |
|
///https://api.exchangerate.host/fluctuation?start_date=2020-01-01&end_date=2020-01-04 |
|
case fluctuation(startDate: String, endDate: String) |
|
///Исторические курсы валют вплоть до 1999 года |
|
///Вы можете запросить у API исторические курсы, добавив дату (в формате ГГГГ-ММ-ДД) |
|
///https://api.exchangerate.host/2020-04-04?base=USD&symbols=RUB |
|
case rate(date: String, from: String, to: String, amount: Double) |
|
///Ежедневная историческая ставка между двумя выбранными датами с максимальным временным интервалом 366 дней |
|
case timeseries(start: String, end: String, base: String, currency: String) |
|
|
|
var path: String { |
|
switch self { |
|
case .rates: |
|
return "/latest" |
|
case .convert: |
|
return "/convert" |
|
case .fluctuation: |
|
return "/fluctuation" |
|
///ГГГГ-ММ-ДД |
|
case .rate(rate: let rate): |
|
return "/\(rate.date)" |
|
case .timeseries: |
|
return "/timeseries" |
|
} |
|
} |
|
|
|
var parameters: [String: String] { |
|
switch self { |
|
case .rates(base: let base): |
|
return ["base" : base] |
|
case .convert(from: let from, to: let to, amount: let amount): |
|
return ["from": from, "to": to, "amount": String(amount)] |
|
case .fluctuation(startDate: let startDate, endDate: let endDate): |
|
return ["start_date": startDate, "end_date" : endDate] |
|
case .rate(date: _, from: let from, to: let to, amount: let amount): |
|
return ["base": from, "symbols": to, "amount": String(amount)] |
|
case .timeseries(start: let start, end: let end, base: let base, currency: let currency): |
|
return ["start_date": start, "end_date": end, "base": base, "symbols": currency] |
|
} |
|
} |
|
|
|
func url() -> URL? { |
|
var components = URLComponents() |
|
components.scheme = "https" |
|
components.host = "api.exchangerate.host" |
|
components.path = self.path |
|
components.queryItems = self.parameters.map() { URLQueryItem(name: $0, value: $1) } |
|
return components.url |
|
} |
|
|
|
|
|
} |