Может ли Locale определить страну по коду валюты? - PullRequest
2 голосов
/ 04 мая 2019

Я искал этот ответ здесь, а также в официальной документации, но я не могу найти ответ на этот вопрос.У меня есть коды валют (например, "EUR").Мне нужно получить код страны (например, «ЕС»).Итак, я видел, что могу делать это наоборот (получение кода валюты с использованием кода страны), но я пытался изменить это решение для своих нужд, и в результате я получил ноль.Также я знаю, что могу использовать простое решение - удалить последнюю букву из кода валюты, чтобы получить код страны (это работает в большинстве случаев из моих данных API, но не везде), - но я чувствую, что этот подход небезопасен.Поэтому мой вопрос похож на заголовок: Могу ли я определить страну по коду валюты, используя Locale?

Вот мой подход:

с NSLocale

extension NSLocale {

   static func currencySymbolFromCode(code: String) -> String? {
      let localeIdentifier = NSLocale.localeIdentifier(fromComponents: [NSLocale.Key.currencyCode.rawValue : code])
      let locale = NSLocale(localeIdentifier: localeIdentifier)
      return locale.object(forKey: NSLocale.Key.countryCode) as? String
}

}

с Locale

extension Locale {    
  static let countryCode: [String: String] = Locale.isoCurrencyCodes.reduce(into: [:]) {
        let locale = Locale(identifier: Locale.identifier(fromComponents: [NSLocale.Key.currencyCode.rawValue: $1]))
        $0[$1] = (locale.regionCode)
    }
}

1 Ответ

1 голос
/ 04 мая 2019

Валюта может быть связана с несколькими странами, вы должны создать свою собственную реализацию данных, такую ​​как json

{
"EUR":"PL",
"USD":"CA"
}

Создайте файл в своем проекте XCode и назовите его, например, data.json,и вставьте такой JSON, как указано выше, наконец, используйте следующий метод

func getCountryCode(currency: String) -> String? {
    var countryCode: String?
    let url = Bundle.main.url(forResource: "data", withExtension: "json")!
    do {
        let data = try Data(contentsOf: url)
        let json = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as? [String: String]
        countryCode = json?[currency]
    } catch {
        print(error.localizedDescription)
    }

    return countryCode
}

Использование

if let countryCode = getCountryCode(currency: "EUR") {
    print(countryCode)
}
...