如何在 Swift 3 中使用 NSLocale 获取国家代码
Posted
技术标签:
【中文标题】如何在 Swift 3 中使用 NSLocale 获取国家代码【英文标题】:How to get country code using NSLocale in Swift 3 【发布时间】:2016-09-20 14:02:24 【问题描述】:您能否帮助了解如何在Swift 3
中使用NSLocale
获取国家/地区代码?
这是我之前使用的代码。
NSLocale.currentLocale().objectForKey(NSLocaleCountryCode) as! String
我可以在 Swift 3 中获得如下语言代码。
Locale.current.languageCode!
如我所见,获取 languageCode 很简单,但 countryCode 属性不可用。
【问题讨论】:
与***.com/a/39519359/1187415 相同的方法在这里也适用:(Locale.current as NSLocale).object(forKey: .countryCode)
。
我可以看到工作。感谢您的帮助。
让 locale = Locale.current print(locale.regionCode)
我猜 regionCode 与 countryCode 不同?
@MartinR 我已编辑此内容以供您查看
【参考方案1】:
您可以在 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.regionCode
就行了,看我的回答。 ***.com/a/60450519/777350【参考方案2】:
见Wojciech N.'s answer 寻求更简单的解决方案!
与NSLocale Swift 3 类似,您必须将覆盖类型Locale
转换回它的
基金会对应方NSLocale
以检索国家代码:
if let countryCode = (Locale.current as NSLocale).object(forKey: .countryCode) as? String
print(countryCode)
【讨论】:
不用投了,用Locale.regionCode
就行了,看我的回答。 ***.com/a/60450519/777350【参考方案3】:
如果您确定您使用的是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"
【讨论】:
【参考方案4】:NSLocale.countryCode
与Locale.regionCode
相同
这是来自Locale
的苹果实现。 Locale.swift
/// Returns the region code of the locale, or nil if it has none.
///
/// For example, for the locale "zh-Hant-HK", returns "HK".
public var regionCode: String?
// n.b. this is called countryCode in ObjC
if let result = _wrapped.object(forKey: .countryCode) as? String
if result.isEmpty
return nil
else
return result
else
return nil
【讨论】:
您好,包装的是什么?它给了我错误。我应该申报吗? 只要使用Locale.current.regionCode
好的,谢谢。我已经用过了。但我想知道你的方法。所以问。【参考方案5】:
//MARK:- Get both country code and Mobile Phone number code
var sendPhoneNumber = ""
if let countryCode = (Locale.current as NSLocale).object(forKey: .countryCode) as? String
print(countryCode)
if countryCode != ""
let getCode = self.getCountryPhonceCode(countryCode)
if getCode != ""
sendPhoneNumber = getCode + tfMobileNumber.text!
getOTP(getPhoneNumber: sendPhoneNumber)
//MARK:- Custom methods
func getCountryPhonceCode (_ country : String) -> String
var countryDictionary = ["AF":"93",
"AL":"355",
"DZ":"213",
"AS":"1",
"AD":"376",
"AO":"244",
"AI":"1",
"AG":"1",
"AR":"54",
"AM":"374",
"AW":"297",
"AU":"61",
"AT":"43",
"AZ":"994",
"BS":"1",
"BH":"973",
"BD":"880",
"BB":"1",
"BY":"375",
"BE":"32",
"BZ":"501",
"BJ":"229",
"BM":"1",
"BT":"975",
"BA":"387",
"BW":"267",
"BR":"55",
"IO":"246",
"BG":"359",
"BF":"226",
"BI":"257",
"KH":"855",
"CM":"237",
"CA":"1",
"CV":"238",
"KY":"345",
"CF":"236",
"TD":"235",
"CL":"56",
"CN":"86",
"CX":"61",
"CO":"57",
"KM":"269",
"CG":"242",
"CK":"682",
"CR":"506",
"HR":"385",
"CU":"53",
"CY":"537",
"CZ":"420",
"DK":"45",
"DJ":"253",
"DM":"1",
"DO":"1",
"EC":"593",
"EG":"20",
"SV":"503",
"GQ":"240",
"ER":"291",
"EE":"372",
"ET":"251",
"FO":"298",
"FJ":"679",
"FI":"358",
"FR":"33",
"GF":"594",
"PF":"689",
"GA":"241",
"GM":"220",
"GE":"995",
"DE":"49",
"GH":"233",
"GI":"350",
"GR":"30",
"GL":"299",
"GD":"1",
"GP":"590",
"GU":"1",
"GT":"502",
"GN":"224",
"GW":"245",
"GY":"595",
"HT":"509",
"HN":"504",
"HU":"36",
"IS":"354",
"IN":"91",
"ID":"62",
"IQ":"964",
"IE":"353",
"IL":"972",
"IT":"39",
"JM":"1",
"JP":"81",
"JO":"962",
"KZ":"77",
"KE":"254",
"KI":"686",
"KW":"965",
"KG":"996",
"LV":"371",
"LB":"961",
"LS":"266",
"LR":"231",
"LI":"423",
"LT":"370",
"LU":"352",
"MG":"261",
"MW":"265",
"MY":"60",
"MV":"960",
"ML":"223",
"MT":"356",
"MH":"692",
"MQ":"596",
"MR":"222",
"MU":"230",
"YT":"262",
"MX":"52",
"MC":"377",
"MN":"976",
"ME":"382",
"MS":"1",
"MA":"212",
"MM":"95",
"NA":"264",
"NR":"674",
"NP":"977",
"NL":"31",
"AN":"599",
"NC":"687",
"NZ":"64",
"NI":"505",
"NE":"227",
"NG":"234",
"NU":"683",
"NF":"672",
"MP":"1",
"NO":"47",
"OM":"968",
"PK":"92",
"PW":"680",
"PA":"507",
"PG":"675",
"PY":"595",
"PE":"51",
"PH":"63",
"PL":"48",
"PT":"351",
"PR":"1",
"QA":"974",
"RO":"40",
"RW":"250",
"WS":"685",
"SM":"378",
"SA":"966",
"SN":"221",
"RS":"381",
"SC":"248",
"SL":"232",
"SG":"65",
"SK":"421",
"SI":"386",
"SB":"677",
"ZA":"27",
"GS":"500",
"ES":"34",
"LK":"94",
"SD":"249",
"SR":"597",
"SZ":"268",
"SE":"46",
"CH":"41",
"TJ":"992",
"TH":"66",
"TG":"228",
"TK":"690",
"TO":"676",
"TT":"1",
"TN":"216",
"TR":"90",
"TM":"993",
"TC":"1",
"TV":"688",
"UG":"256",
"UA":"380",
"AE":"971",
"GB":"44",
"US":"1",
"UY":"598",
"UZ":"998",
"VU":"678",
"WF":"681",
"YE":"967",
"ZM":"260",
"ZW":"263",
"BO":"591",
"BN":"673",
"CC":"61",
"CD":"243",
"CI":"225",
"FK":"500",
"GG":"44",
"VA":"379",
"HK":"852",
"IR":"98",
"IM":"44",
"JE":"44",
"KP":"850",
"KR":"82",
"LA":"856",
"LY":"218",
"MO":"853",
"MK":"389",
"FM":"691",
"MD":"373",
"MZ":"258",
"PS":"970",
"PN":"872",
"RE":"262",
"RU":"7",
"BL":"590",
"SH":"290",
"KN":"1",
"LC":"1",
"MF":"590",
"PM":"508",
"VC":"1",
"ST":"239",
"SO":"252",
"SJ":"47",
"SY":"963",
"TW":"886",
"TZ":"255",
"TL":"670",
"VE":"58",
"VN":"84",
"VG":"284",
"VI":"340"]
if countryDictionary[country] != nil
return countryDictionary[country]!
else
return ""
【讨论】:
【参考方案6】:print(NSLocale.current.regionCode)
【讨论】:
这与@wojciech-n 2016 年的回答相同......除了它已经过时(它应该是 Swift 3 中的 Locale,而不是 Swift 2 中的 NSLocale)。以上是关于如何在 Swift 3 中使用 NSLocale 获取国家代码的主要内容,如果未能解决你的问题,请参考以下文章