2016-09-20 10 views
33

Czy możesz pomóc, aby uzyskać kod kraju za pomocą NSLocale w Swift 3?Jak uzyskać kod kraju za pomocą NSLocale w Swift 3

To jest poprzedni kod, którego używałem.

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

mogę uzyskać kod języka jak poniżej w Swift 3.

Locale.current.languageCode! 

Jak widzę, ściągam languageCode jest prosta, ale nieruchomość countryCode nie jest dostępna.

+1

To samo podejście, co w przypadku http://stackoverflow.com/a/39519359/1187415, działa również tutaj: '(Locale.current jako NSLocale) .object (forKey: .countryCode)'. –

+0

Widzę pracę. Dzięki za pomoc. – digidhamu

+0

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

Odpowiedz

41

Zobacz Wojciech N.'s answer dla prostszego rozwiązania!


Podobnie jak w NSLocale Swift 3, trzeba rzucić typ nakładki Locale powrotem do Fundacji odpowiednik NSLocale aby pobrać kod kraju:

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

Można użyć właściwości Kod_regionu na Locale struct.

Locale.current.regionCode 

Nie jest to dokumentacja zastępująca starą konstrukcję NSLocaleCountryCode, ale wygląda na to, że tak jest. Poniższy kod sprawdza countryCodes dla wszystkich znanych ustawień regionalnych i porównuje je z kodami regionu. Są identyczne.

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

Ładnie zrobione! Uwielbiam to, że w zasadzie udowodniłeś swoje przypuszczenia. Wiem, że wybrana odpowiedź jest poprawna technicznie, ale och, jak ja nienawidzę tego mostowania do NSLocale. –

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

To jest to samo, co odpowiedź @ wojciech-n z 2016 ... z wyjątkiem tego, że jest przestarzała (powinna być Locale w Swift 3, zamiast NSLocale, która jest dla Swift 2). – Moritz

0

Jeśli upewnij się, że używasz NSLocale a nie instancję Locale, można użyć właściwości countryCode:

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

Jeśli spróbujesz użyć countryCode z Swift Locale Xcode spowoduje błąd z sugestią użycia regionCode zamiast:

let swiftLocale: Locale = Locale.current 
let swiftCountry: String? = swiftLocale.countryCode 
// > Error "countryCode' is unavailable: use regionCode instead" 
Powiązane problemy