ios - formatter swift
Cómo obtener el código de país usando NSLocale en Swift 3 (4)
¿Podría ayudarnos a obtener el código de país mediante NSLocale
en Swift 3
?
Este es el código anterior que he estado usando.
NSLocale.currentLocale().objectForKey(NSLocaleCountryCode) as! String
Puedo obtener el código de idioma como abajo en Swift 3.
Locale.current.languageCode!
Como puedo ver, ir a languageCode es sencillo pero la propiedad countryCode no está disponible.
Puede usar la propiedad regionCode en Locale struct.
Locale.current.regionCode
No está documentado como un sustituto del antiguo constructo NSLocaleCountryCode, pero parece que sí lo está. El siguiente código comprueba countryCodes para todas las configuraciones regionales conocidas y las compara con regionCodes. Ellos son idénticos.
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: $0) }
let newCountryCodes = newLocales.map { $0.regionCode }
let oldIdentifiers = NSLocale.availableLocaleIdentifiers
newIdentifiers == oldIdentifiers // true
let oldLocales = oldIdentifiers.map { NSLocale(localeIdentifier: $0) }
let oldLocalesConverted = oldLocales.map { $0 as Locale }
newLocales == oldLocalesConverted // true
let oldComponents = oldIdentifiers.map { NSLocale.components(fromLocaleIdentifier: $0) }
let oldCountryCodes = oldComponents.map { $0[NSLocale.Key.countryCode.rawValue] }
newCountryCodes == oldCountryCodes // true
Si se asegura de que está utilizando una NSLocale
y no de una NSLocale
Locale
, puede usar la propiedad countryCode
:
let locale: NSLocale = NSLocale.current as NSLocale
let country: String? = locale.countryCode
print(country ?? "no country")
// > Prints "IE" or some other country code
Si intenta usar countryCode
con Swift Locale
Xcode le dará un error con una sugerencia para usar regionCode
en regionCode
lugar:
let swiftLocale: Locale = Locale.current
let swiftCountry: String? = swiftLocale.countryCode
// > Error "countryCode'' is unavailable: use regionCode instead"
¡Vea la respuesta de Wojciech N. para una solución más simple!
De forma similar a NSLocale Swift 3 , debe volver a NSLocale
el tipo de superposición Locale
a su contraparte de Fundación NSLocale
para recuperar el código de país:
if let countryCode = (Locale.current as NSLocale).object(forKey: .countryCode) as? String {
print(countryCode)
}
print(NSLocale.current.regionCode)