Pourriez-vous s'il vous plaît aider sur la façon d'obtenir le code de pays en utilisant NSLocale
dans Swift 3
?
Ceci est le code précédent que j'ai utilisé.
NSLocale.currentLocale().objectForKey(NSLocaleCountryCode) as! String
Je peux obtenir le code de langue comme ci-dessous dans Swift 3.
Locale.current.languageCode!
Comme je peux le constater, l'extraction de languageCode est simple, mais la propriété countryCode n'est pas disponible.
Voir réponse de Wojciech N. pour une solution plus simple!
De la même manière que dans NSLocale Swift , vous devez attribuer le type de surimpression Locale
à son homologue Foundation NSLocale
afin de récupérer le code pays:
if let countryCode = (Locale.current as NSLocale).object(forKey: .countryCode) as? String {
print(countryCode)
}
Vous pouvez utiliser la propriété regionCode sur la structure Locale.
Locale.current.regionCode
Il n'est pas documenté en tant que substitut de l'ancienne construction NSLocaleCountryCode, mais il semble que ce soit le cas. Le code suivant vérifie les codes countryCodes pour tous les paramètres régionaux connus et les compare aux codes regionCodes. Ils sont identiques.
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 vous vous assurez que vous utilisez une instance NSLocale
et non une instance Locale
, vous pouvez utiliser la propriété 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 vous essayez d'utiliser countryCode
avec un Swift Locale
Xcode vous donnera une erreur en suggérant d'utiliser regionCode
à la place:
let swiftLocale: Locale = Locale.current
let swiftCountry: String? = swiftLocale.countryCode
// > Error "countryCode' is unavailable: use regionCode instead"