Cocoa touch 如何获取Swift ios中的国家/地区列表?
我已经看到了两个与我类似的问题,但这些问题的答案对我来说并不适用。我有一个老项目,在一组方括号内手动键入了一个国家列表 我可以很容易地在我的pickerView中使用它,但我想知道是否有更有效的方法来实现这一点Cocoa touch 如何获取Swift ios中的国家/地区列表?,cocoa-touch,swift,nsarray,uipickerview,nslocale,Cocoa Touch,Swift,Nsarray,Uipickerview,Nslocale,我已经看到了两个与我类似的问题,但这些问题的答案对我来说并不适用。我有一个老项目,在一组方括号内手动键入了一个国家列表 我可以很容易地在我的pickerView中使用它,但我想知道是否有更有效的方法来实现这一点 我将在UIPickerView中使用国家列表。您可以使用NSLocale类的isoCountryCodes获取国家列表,该类返回一个[String]数组。从那里,您可以使用NSLocale的displayName(forKey:)方法获得国家名称。看起来是这样的: var countri
我将在UIPickerView中使用国家列表。您可以使用NSLocale类的
isoCountryCodes
获取国家列表,该类返回一个[String]
数组。从那里,您可以使用NSLocale
的displayName(forKey:)
方法获得国家名称。看起来是这样的:
var countries: [String] = []
for code in NSLocale.isoCountryCodes {
let id = NSLocale.localeIdentifier(fromComponents: [NSLocale.Key.countryCode.rawValue: code])
let name = NSLocale(localeIdentifier: "en_UK").displayName(forKey: NSLocale.Key.identifier, value: id) ?? "Country not found for code: \(code)"
countries.append(name)
}
print(countries)
和伊恩的一样,但短一些
let countries = NSLocale.ISOCountryCodes().map { (code:String) -> String in
let id = NSLocale.localeIdentifierFromComponents([NSLocaleCountryCode: code])
return NSLocale(localeIdentifier: "en_US").displayNameForKey(NSLocaleIdentifier, value: id) ?? "Country not found for code: \(code)"
}
print(countries)
此外,将显示的国家名称本地化也是一种很好的做法。所以除了视频27,答案是:
let countriesArray = NSLocale.ISOCountryCodes().map { (code:String) -> String in
let id = NSLocale.localeIdentifierFromComponents([NSLocaleCountryCode: code])
let currentLocaleID = NSLocale.currentLocale().localeIdentifier
return NSLocale(localeIdentifier: currentLocaleID).displayNameForKey(NSLocaleIdentifier, value: id) ?? "Country not found for code: \(code)"
}
以下是@vedo27在Swift 3中的答案
let countries = NSLocale.isoCountryCodes.map { (code:String) -> String in
let id = NSLocale.localeIdentifier(fromComponents: [NSLocale.Key.countryCode.rawValue: code])
return NSLocale(localeIdentifier: "en_US").displayName(forKey: NSLocale.Key.identifier, value: id) ?? "Country not found for code: \(code)"
}
Swift 3声明为
var
:
var countries: [String] {
let myLanguageId = "en" // in which language I want to show the list
return NSLocale.isoCountryCodes.map {
return NSLocale(localeIdentifier: myLanguageId).localizedString(forCountryCode: $0) ?? $0
}
}
SWIFT 3和4
var countries: [String] = []
for code in NSLocale.isoCountryCodes as [String] {
let id = NSLocale.localeIdentifier(fromComponents: [NSLocale.Key.countryCode.rawValue: code])
let name = NSLocale(localeIdentifier: "en_UK").displayName(forKey: NSLocale.Key.identifier, value: id) ?? "Country not found for code: \(code)"
countries.append(name)
}
print(countries)
SWIFT 4
var countries: [String] = []
for code in NSLocale.isoCountryCodes as [String] {
let id = NSLocale.localeIdentifier(fromComponents: [NSLocale.Key.countryCode.rawValue: code])
let name = NSLocale(localeIdentifier: "en_UK").displayName(forKey: NSLocale.Key.identifier, value: id) ?? "Country not found for code: \(code)"
countries.append(name)
}
print(countries)
下面是一个在Swift 4中完成此操作的优雅方法
var countries: [String] = {
var arrayOfCountries: [String] = []
for code in NSLocale.isoCountryCodes as [String] {
let id = NSLocale.localeIdentifier(fromComponents: [NSLocale.Key.countryCode.rawValue: code])
let name = NSLocale(localeIdentifier: "en_UK").displayName(forKey: NSLocale.Key.identifier, value: id) ?? "Country not found for code: \(code)"
arrayOfCountries.append(name)
}
return arrayOfCountries
}()
或者,您可以使用swift 4并通过系统语言进行本地化
import Foundation
struct Country {
let name: String
let code: String
}
final class CountryHelper {
class func allCountries() -> [Country] {
var countries = [Country]()
for code in Locale.isoRegionCodes as [String] {
if let name = Locale.autoupdatingCurrent.localizedString(forRegionCode: code) {
countries.append(Country(name: name, code: code))
}
}
return countries
}
}
Swift 4.2
let languageList = Locale.isoLanguageCodes.compactMap { Locale.current.localizedString(forLanguageCode: $0) }
let countryList = Locale.isoRegionCodes.compactMap { Locale.current.localizedString(forRegionCode: $0) }
更新了vedo27的答案,但仍存在问题 Swift 5:
let countries : [String] = NSLocale.isoCountryCodes.map { (code:String) -> String in
let id = NSLocale.localeIdentifier(fromComponents: [NSLocale.Key.countryCode.rawValue: code])
return NSLocale(localeIdentifier: "en_US").displayName(forKey: NSLocale.Key.identifier, value: id) ?? "Country not found for code: \(code)"
}
此外,为了获得按字母顺序排列的国家/地区的排序数组,请在获取国家/地区列表后按顺序将其添加到下面
let sortedcountries = countries.sorted { $0 < $1 }
let sortedcountries=countries.sorted{$0<$1}
Swift您可以轻松检索国家名称及其国旗表情符号
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
var countriesData = [(name: String, flag: String)]()
for code in NSLocale.isoCountryCodes {
let flag = String.emojiFlag(for: code)
let id = NSLocale.localeIdentifier(fromComponents: [NSLocale.Key.countryCode.rawValue: code])
if let name = NSLocale(localeIdentifier: "en_UK").displayName(forKey: NSLocale.Key.identifier, value: id) {
countriesData.append((name: name, flag: flag!))
}else{
//"Country not found for code: \(code)"
}
}
print(countriesData)
}
}
extension String {
static func emojiFlag(for countryCode: String) -> String! {
func isLowercaseASCIIScalar(_ scalar: Unicode.Scalar) -> Bool {
return scalar.value >= 0x61 && scalar.value <= 0x7A
}
func regionalIndicatorSymbol(for scalar: Unicode.Scalar) -> Unicode.Scalar {
precondition(isLowercaseASCIIScalar(scalar))
// 0x1F1E6 marks the start of the Regional Indicator Symbol range and corresponds to 'A'
// 0x61 marks the start of the lowercase ASCII alphabet: 'a'
return Unicode.Scalar(scalar.value + (0x1F1E6 - 0x61))!
}
let lowercasedCode = countryCode.lowercased()
guard lowercasedCode.count == 2 else { return nil }
guard lowercasedCode.unicodeScalars.reduce(true, { accum, scalar in accum && isLowercaseASCIIScalar(scalar) }) else { return nil }
let indicatorSymbols = lowercasedCode.unicodeScalars.map({ regionalIndicatorSymbol(for: $0) })
return String(indicatorSymbols.map({ Character($0) }))
}
}
导入UIKit
类ViewController:UIViewController{
重写func viewDidLoad(){
super.viewDidLoad()
var countriesData=[(名称:String,标志:String)]()
对于NSLocale.isoCountryCodes中的代码{
let flag=String.emojiFlag(for:code)
let id=NSLocale.localeIdentifier(fromComponents:[NSLocale.Key.countryCode.rawValue:code])
如果let name=NSLocale(localeIdentifier:“en_UK”).displayName(forKey:NSLocale.Key.identifier,值:id){
countriesData.append((名称:name,标志:flag!))
}否则{
//“找不到代码为\(代码)的国家/地区”
}
}
打印(国家数据)
}
}
扩展字符串{
静态函数emojiFlag(用于国家代码:String)->String{
func isLowercaseASCIIScalar(u标量:Unicode.scalar)->Bool{
返回scalar.value>=0x61&&scalar.value Unicode.scalar{
前提条件(IsLowerCasciisCalar(标量))
//0x1F1E6标记区域指示器符号范围的开始,并对应于“A”
//0x61标记小写ASCII字母的开头:“a”
返回Unicode.Scalar(Scalar.value+(0x1F1E6-0x61))!
}
让lowercasedCode=countryCode.lowercased()
guard lowercasedCode.count==2 else{return nil}
guard lowercasedCode.unicodeScalars.reduce(true,{accum,accum中的标量&&IsLowercaseAssiScalar(标量)})else{return nil}
让indicatorSymbols=lowercasedCode.unicodeScalars.map({regionalIndicatorSymbol(for:$0)})
返回字符串(indicatorSymbols.map({Character($0)}))
}
}
结果:
以下是Swift 5.1的代码(至少这对我来说是有效的,因为许多函数都已重命名):
这里的数组是一个[String]localizedString(forCountryCode:code)只能从IOS10中获得为什么人们会自动假定某人想要看到的语言是“en_-US”或“en_-UK”或者别的什么?我从来都不明白为什么更多的人不按你的建议做。谢谢你添加这个!如果你否决我,你能告诉我如何改进我的答案吗?谢谢我可以得到所有州和城市,也可以像特定国家一样过滤所有州和城市。谢谢你可以使用这个现成的模块。虽然它不是免费的。请在youtube上观看本教程。