ios-如何在Swift 3中使用NSLocale获取国家代码

您能帮忙在Swift 3中使用NSLocale获取国家代码的方法吗?

这是我一直在使用的先前代码。

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

我可以在Swift 3中获得如下的语言代码。

Locale.current.languageCode!

如我所见,获取languageCode很简单,但是countryCode属性不可用。

digidhamu asked 2020-08-06T11:19:34Z
4个解决方案
64 votes

您可以在Locale结构上使用regionCode属性。

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
Wojciech Nagrodzki answered 2020-08-06T11:20:09Z
57 votes

参见Wojciech N.的答案一个更简单的解决方案!


与NSLocale Swift 3类似,您必须将叠加类型Locale转换回其基金会对应方NSLocale以获取国家/地区代码:

if let countryCode = (Locale.current as NSLocale).object(forKey: .countryCode) as? String {
    print(countryCode)
}
Martin R answered 2020-08-06T11:19:44Z
4 votes

如果确定使用的是countryCode实例,而不是Locale实例,则可以使用regionCode属性:

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"
nevan king answered 2020-08-06T11:20:34Z
-6 votes
print(NSLocale.current.regionCode)
anshu garg answered 2020-08-06T11:20:50Z
translate from https://stackoverflow.com:/questions/39596238/how-to-get-country-code-using-nslocale-in-swift-3