Swift — получение списка стран

#ios #arrays #swift #nslocale #countries

#iOS #массивы #swift #nslocale #Страны

Вопрос:

Как я могу получить массив со всеми названиями стран в Swift? Я попытался преобразовать код, который у меня был в Objective-C, который был следующим:

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

И в Swift я не могу пройти отсюда:

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

Кто-нибудь из вас знает об этом?

Спасибо

Ответ №1:

Вот расширение Swift для NSLocale, которое возвращает массив понятных для Swift языковых структур с названиями стран и кодами стран. Его можно было бы легко расширить, включив в него данные по другим странам.

 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
    }

}
 

И тогда легко получить набор таких стран, как эта:

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

Ответ №2:

Прежде всего ISOCountryCodes требуется скобка аргумента, поэтому вместо этого это было бы ISOCountryCodes() . Во-вторых, вам не нужны круглые скобки вокруг NSLocale и ISOCountryCodes() . Кроме того, arrayWithCapacity устарел, что означает, что он удален из языка. Рабочая версия этого будет примерно такой

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

Комментарии:

1. Я получаю нулевые элементы в массиве!

Ответ №3:

Это операция, а не свойство

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