buttons cocoa-touch swift nsarray uipickerview nslocale

cocoa touch - buttons - ¿Cómo obtengo una lista de países en Swift ios?



uicontrol swift (8)

Ya he visto dos preguntas similares a las mías, pero las respuestas a esas preguntas no funcionan para mí. Tengo un proyecto antiguo con una lista de países escritos manualmente dentro de un conjunto de corchetes.

Puedo usar esto fácilmente en mi pickerView pero me pregunto si hay una manera más eficiente de hacerlo.

Usaré la lista de países en un UIPickerView.


Alternativamente, puede tenerlo en swift 4 y localizado por el idioma del sistema.

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


Aquí está la respuesta de @vedo27 en 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)" }


Igual que el de Ian pero más corto.

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)


Swift 3 declarado como una 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 } }


También es una buena práctica localizar el nombre mostrado de los países. Así que además de responder vedo27 sería:

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


SWIFT 3 y 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

Esta es una forma elegante de hacerlo en 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 }()


Puede obtener una lista de países utilizando el método ISOCountryCodes() la clase ISOCountryCodes() que devuelve una matriz de [AnyObject] que ha emitido como [String] . A partir de ahí, obtendrá el nombre del país utilizando el método displayNameForKey de NSLocale. Se parece a esto:

var countries: [String] = [] for code in NSLocale.ISOCountryCodes() as [String] { let id = NSLocale.localeIdentifierFromComponents([NSLocaleCountryCode: code]) let name = NSLocale(localeIdentifier: "en_UK").displayNameForKey(NSLocaleIdentifier, value: id) ?? "Country not found for code: /(code)" countries.append(name) } println(countries)