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