Как получить код страны с помощью NSLocale в Swift 3

не могли бы вы помочь о том, как получить код страны с помощью NSLocale на Swift 3 ?

Это предыдущий код, который я использую.

NSLocale.currentLocale().objectForKey(NSLocaleCountryCode) as! String

Я могу получить код языка, как показано ниже в Swift 3.

Locale.current.languageCode!

как я вижу, извлечение languageCode прямо вперед, но свойство countryCode недоступно.

4 ответов


посмотреть ответ Войцеха Н. для более простого решения!


аналогично NSLocale Свифт 3, вы должны бросить тип наложения Locale обратно в Foundation counterpart NSLocale для того, чтобы получить код страны:

if let countryCode = (Locale.current as NSLocale).object(forKey: .countryCode) as? String {
    print(countryCode)
}

вы можете использовать свойство regionCode в структуре локали.

Locale.current.regionCode

он не задокументирован как замена старой конструкции nslocalecountrycode, но похоже, что это так. Следующий код проверяет countryCodes для всех известных локалей и сравнивает их с regionCodes. Они идентичны.

public func ==(lhs: [String?], rhs: [String?]) -> Bool {
    guard lhs.count == rhs.count else { return false }

    for (left, right) in zip(lhs, rhs) {
        if left != right {
            return false
        }
    }

    return true
}

let newIdentifiers = Locale.availableIdentifiers
let newLocales = newIdentifiers.map { Locale(identifier: ) }
let newCountryCodes = newLocales.map { .regionCode }

let oldIdentifiers = NSLocale.availableLocaleIdentifiers
newIdentifiers == oldIdentifiers // true

let oldLocales = oldIdentifiers.map { NSLocale(localeIdentifier: ) }
let oldLocalesConverted = oldLocales.map {  as Locale }
newLocales == oldLocalesConverted // true

let oldComponents = oldIdentifiers.map { NSLocale.components(fromLocaleIdentifier: ) }
let oldCountryCodes = oldComponents.map { [NSLocale.Key.countryCode.rawValue] }
newCountryCodes == oldCountryCodes // true

если вы убедитесь, что вы используете NSLocale, а не Locale например, вы можете использовать countryCode свойства:

let locale: NSLocale = NSLocale.current as NSLocale
let country: String? = locale.countryCode
print(country ?? "no country")
// > Prints "IE" or some other country code

если вы пытаетесь использовать countryCode С быстрым Locale Xcode даст вам ошибку с предложением использовать regionCode вместо:

let swiftLocale: Locale = Locale.current
let swiftCountry: String? = swiftLocale.countryCode
// > Error "countryCode' is unavailable: use regionCode instead"

print(NSLocale.current.regionCode)