2016-09-20 4 views
33

Könnten Sie bitte helfen, wie Sie den Ländercode unter Verwendung von NSLocale in Swift 3 erhalten?So erhalten Sie den Ländercode mit NSLocale in Swift 3

Dies ist der vorherige Code, den ich verwendet habe.

NSLocale.currentLocale().objectForKey(NSLocaleCountryCode) as! String 

Ich kann Sprachcode erhalten, wie unten in Swift 3.

Locale.current.languageCode! 

Wie ich sehe, Sprachcode zu holen ist gerade nach vorne, aber country Eigenschaft ist nicht verfügbar.

+1

Derselbe Ansatz wie in http://stackoverflow.com/a/39519359/1187415 funktioniert auch hier: '(Locale.current as NSLocale) .object (forKey: .countryCode)'. –

+0

Ich kann arbeiten sehen. Danke für Ihre Hilfe. – digidhamu

+0

let locale = Locale.current print (locale.regionCode) –

Antwort

41

Siehe Wojciech N.'s answer für eine einfachere Lösung!


Ähnlich wie in NSLocale Swift 3 haben Sie Locale zurück in seine Stiftung Pendant NSLocale, um die Overlay-Typ werfen den Ländercode abzurufen:

if let countryCode = (Locale.current as NSLocale).object(forKey: .countryCode) as? String { 
    print(countryCode) 
} 
44

Sie Regioncode-Eigenschaft auf Locale verwenden können Struktur.

Locale.current.regionCode 

Es ist nicht als Ersatz für alte NSLocaleCountryCode-Konstrukt dokumentiert, aber es sieht aus wie es ist. Der folgende Code prüft countryCodes für alle bekannten Locales und vergleicht sie mit regionCodes. Sie sind identisch.

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 
+0

Schön gemacht! Liebe es, dass du deine Vermutung im Wesentlichen bewiesen hast. Ich weiß, dass die ausgewählte Antwort technisch korrekt ist, aber oh, wie ich diese Überbrückung zu NSLocale hasse. –

-5
print(NSLocale.current.regionCode) 
+0

Das ist das gleiche wie die Antwort von @ wojciech-n von 2016 ... außer dass es veraltet ist (es sollte Locale in Swift 3 sein, anstelle von NSLocale, was für Swift 2 ist). – Moritz

0

Wenn Sie sicherstellen, dass Sie ein NSLocale und keine Locale Instanz verwenden, können Sie die countryCode Eigenschaft:

let locale: NSLocale = NSLocale.current as NSLocale 
let country: String? = locale.countryCode 
print(country ?? "no country") 
// > Prints "IE" or some other country code 

Wenn Sie versuchen, countryCode mit einem Swift zu verwenden Locale Xcode gibt Ihnen einen Fehler mit einem Vorschlag, stattdessen regionCode zu verwenden:

let swiftLocale: Locale = Locale.current 
let swiftCountry: String? = swiftLocale.countryCode 
// > Error "countryCode' is unavailable: use regionCode instead" 
Verwandte Themen