web-dev-qa-db-ja.com

Swift 3でNSLocaleを使用して国コードを取得する方法

Swift 3NSLocaleを使用して国コードを取得する方法についてお問い合わせください。

これは私が使用していた以前のコードです。

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

Swift 3で言語コードを取得できます。

Locale.current.languageCode!

ご覧のとおり、languageCodeの取得は簡単ですが、countryCodeプロパティは使用できません。

42
digidhamu

Wojciech N.の答え を参照して、より簡単な解決策を見つけてください!


NSLocale Swift と同様に、国コードを取得するには、オーバーレイタイプLocaleをFoundationの対応するNSLocaleにキャストし直す必要があります。

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

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
64

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

Swift countryCodeLocaleを使用しようとすると、XcodeはregionCodeを代わりに使用するように提案するエラーを表示します。

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