如何在Swift ios中获取国家列表?

37

我已经看到两个类似于我的问题,但是那些问题的答案对我没有用。我有一个旧项目,其中有一组手动输入的国家名称列表,放在一组方括号中。

我可以轻松地在我的pickerView中使用它,但我想知道是否有更有效的方法来做到这一点?

我将在UIPickerView中使用这个国家列表。


你可以使用这个现成的模块。虽然它不是免费的。看一下这个YouTube教程吧。https://www.youtube.com/watch?v=tovZRZxcTVY&t=23s - Tulon
13个回答

55

您可以使用NSLocale类的isoCountryCodes获取国家列表,该方法返回一个数组[String]。然后,您可以使用NSLocaledisplayName(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)

你好,我能获取所有的州和城市,并且可以过滤出特定国家的所有州和城市吗?谢谢。 - Yogesh Patel
localeIdentifier: "en_UK" 正确吗?我认为应该是 "en_GB"。 - grep

16

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)

16

Swift 4.2

let languageList = Locale.isoLanguageCodes.compactMap { Locale.current.localizedString(forLanguageCode: $0) }
let countryList = Locale.isoRegionCodes.compactMap { Locale.current.localizedString(forRegionCode: $0) }

12

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) }))
    }
}

结果:

在此输入图片描述


9
与Ian的方法类似,但更为简短。
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)

7
另外,将国家的显示名称本地化是一个好的做法。因此,除了vedo27的答案之外,应该这样做:
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)"
    }

4
为什么人们会自动假设某个人想要看的语言是“en_US”、“en_UK”或其他语言?我从未理解为什么更多的人不按照你提出的方式去做。感谢您的补充! - Lance Samaria

4
这是@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)"
}

3

SWIFT 4

以下是用 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
}()

如果你给我一个踩的评价,能否请您告诉我如何改进我的回答,谢谢。 - ricks

3

针对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 }

2

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
    }
}

localizedString(forCountryCode: code) 仅在iOS10及以上版本可用。 - Rajesh73

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接