2016-09-20 6 views
33

Не могли бы вы помочь в получении кода страны с помощью NSLocale в Swift 3?Как получить код страны, используя NSLocale в Свифт 3

Это предыдущий код, который я использовал.

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

я могу получить код языка, как показано ниже в Swift 3.

Locale.current.languageCode! 

Как я могу видеть, выборка LanguageCode прямо вперед, но COUNTRYCODE свойство не доступно.

+1

Здесь также работает тот же подход, что и в http://stackoverflow.com/a/39519359/1187415: '(Locale.current as NSLocale) .object (forKey: .countryCode)'. –

+0

Я вижу работу. Спасибо за вашу помощь. – digidhamu

+0

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

ответ

41

См. Wojciech N.'s answer для более простого решения!


Точно так же, как и в NSLocale Swift 3, вы должны бросить тип наложения Locale назад к своему коллеге Foundation NSLocale для того, чтобы восстановить код страны:

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

Вы можете использовать regionCode недвижимость на Locale структура.

Locale.current.regionCode 

Это не документировано в качестве замены старой NSLocaleCountryCode конструкции, но это выглядит, как она есть. Следующий код проверяет countryCodes для всех известных локалей и сравнивает их с regionCodes. Они идентичны.

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

Красиво сделано! Полюбите это, что вы по существу доказали свою догадку. Я знаю, что выбранный ответ технически корректен, но ох, как я ненавижу это переключение в NSLocale. –

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

Это то же самое, что и ответ @ wojciech-n от 2016 года ... за исключением того, что он устарел (он должен быть Locale в Swift 3, а не NSLocale, который для Swift 2). – Moritz

0

Если вы убедитесь, что вы используете NSLocale, а не Locale экземпляр, вы можете использовать countryCode свойство:

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

Если вы пытаетесь использовать countryCode с Swift Locale Xcode даст вам ошибку с предложением использовать вместо него regionCode:

let swiftLocale: Locale = Locale.current 
let swiftCountry: String? = swiftLocale.countryCode 
// > Error "countryCode' is unavailable: use regionCode instead" 
Смежные вопросы