Swift 3
のNSLocale
を使用して国コードを取得する方法についてお問い合わせください。
これは私が使用していた以前のコードです。
NSLocale.currentLocale().objectForKey(NSLocaleCountryCode) as! String
Swift 3で言語コードを取得できます。
Locale.current.languageCode!
ご覧のとおり、languageCodeの取得は簡単ですが、countryCodeプロパティは使用できません。
Wojciech N.の答え を参照して、より簡単な解決策を見つけてください!
NSLocale Swift と同様に、国コードを取得するには、オーバーレイタイプLocale
をFoundationの対応するNSLocale
にキャストし直す必要があります。
if let countryCode = (Locale.current as NSLocale).object(forKey: .countryCode) as? String {
print(countryCode)
}
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
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 countryCode
でLocale
を使用しようとすると、XcodeはregionCode
を代わりに使用するように提案するエラーを表示します。
let swiftLocale: Locale = Locale.current
let swiftCountry: String? = swiftLocale.countryCode
// > Error "countryCode' is unavailable: use regionCode instead"