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

pourriez-vous nous aider à obtenir le code de pays en utilisant NSLocale dans Swift 3 ?

C'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 voir, récupérer le languageCode est simple mais la propriété countryCode n'est pas disponible.

36
demandé sur digidhamu 2016-09-20 17:02:24

4 réponses

voir réponse de Wojciech N. pour une solution plus simple!


de même que dans NSLocale Swift 3 , vous devez mouler le type de superposition Locale retour à son Contrepartie de la fondation NSLocale afin de récupérer le code de pays:

if let countryCode = (Locale.current as NSLocale).object(forKey: .countryCode) as? String {
    print(countryCode)
}
47
répondu Martin R 2017-05-23 11:54:47

vous pouvez utiliser la propriété regionCode sur la structure Locale.

Locale.current.regionCode

il n'est pas documenté comme un substitut à une ancienne construction NSLocaleCountryCode mais il semble qu'il est. Le code suivant vérifie les codes de pays pour toutes les locales connues et les compare avec les codes de région. 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: "151910920") }
let newCountryCodes = newLocales.map { "151910920".regionCode }

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

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

let oldComponents = oldIdentifiers.map { NSLocale.components(fromLocaleIdentifier: "151910920") }
let oldCountryCodes = oldComponents.map { "151910920"[NSLocale.Key.countryCode.rawValue] }
newCountryCodes == oldCountryCodes // true
57
répondu Wojciech Nagrodzki 2016-09-30 08:43:39

si vous vous assurez que vous utilisez une instance NSLocale et non 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 avec une suggestion d'utiliser regionCode à la place:

let swiftLocale: Locale = Locale.current
let swiftCountry: String? = swiftLocale.countryCode
// > Error "countryCode' is unavailable: use regionCode instead"
1
répondu nevan king 2018-01-17 14:24:59
print(NSLocale.current.regionCode)
-5
répondu anshu garg 2017-06-15 08:18:56