Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa touch 如何获取Swift ios中的国家/地区列表?_Cocoa Touch_Swift_Nsarray_Uipickerview_Nslocale - Fatal编程技术网

Cocoa touch 如何获取Swift ios中的国家/地区列表?

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

我已经看到了两个与我类似的问题,但这些问题的答案对我来说并不适用。我有一个老项目,在一组方括号内手动键入了一个国家列表

我可以很容易地在我的pickerView中使用它,但我想知道是否有更有效的方法来实现这一点


我将在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上观看本教程。