Как получить код страны с помощью 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"