web-dev-qa-db-fra.com

Comment obtenir le code de pays en utilisant NSLocale dans Swift 3

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.

42
digidhamu

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)
}
56
Martin R

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
64
Wojciech Nagrodzki

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"
4
nevan king