简体   繁体   中英

Swift - Get list of countries

How can I get an array with all countries names in Swift? I've tried to convert the code I had in Objective-C, which was this:

if (!pickerCountriesIsShown) {
    NSMutableArray *countries = [NSMutableArray arrayWithCapacity: [[NSLocale ISOCountryCodes] count]];

    for (NSString *countryCode in [NSLocale ISOCountryCodes])
    {
        NSString *identifier = [NSLocale localeIdentifierFromComponents: [NSDictionary dictionaryWithObject: countryCode forKey: NSLocaleCountryCode]];
        NSString *country = [[NSLocale currentLocale] displayNameForKey: NSLocaleIdentifier value: identifier];
        [countries addObject: country];
    }

And in Swift I can't pass from here:

        if (!countriesPickerShown) {
        var countries: NSMutableArray = NSMutableArray()
        countries = NSMutableArray.arrayWithCapacity((NSLocale.ISOCountryCodes).count) // Here gives the Error. It marks NSLocale.ISOCountryCodes and .count

Does anyone of you know about this?

Thanks

Here's a Swift extension to NSLocale that returns an array of Swift-friendly Locale structs with the country names and country codes. It could easily be extended to include other country data.

extension NSLocale {

    struct Locale {
        let countryCode: String
        let countryName: String
    }

    class func locales() -> [Locale] {

        var locales = [Locale]()
        for localeCode in NSLocale.ISOCountryCodes() {
            let countryName = NSLocale.systemLocale().displayNameForKey(NSLocaleCountryCode, value: localeCode)!
            let countryCode = localeCode as! String
            let locale = Locale(countryCode: countryCode, countryName: countryName)
            locales.append(locale)
        }

        return locales
    }

}

And then it's easy to get the array of countries like this:

for locale in NSLocale.locales() {
    println("\(locale.countryCode) - \(locale.countryName)")
}

First of all ISOCountryCodes requires argument parenthesis so instead it would be ISOCountryCodes() . Second, you dont need parenthesis around NSLocale and ISOCountryCodes() . Also, arrayWithCapacity is deprecated meaning it is removed from the language. A working version of this would be somewhat like this

if (!countriesPickerShown) {
    var countries = NSMutableArray()
    countries = NSMutableArray(capacity: (NSLocale.ISOCountryCodes().count))
}

It is an Operation not a Property

if let codes = NSLocale.ISOCountryCodes() {
    println(codes)
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM