Почему, как и в приведенном ниже вопросе, код возвращает пустой список массивов?
let symbols = Calendar.current.shortMonthSymbols //[]
Я предполагал, что в массиве всегда 12 элементов, поэтому я просто обращаюсь к нему:
let selected = symbols[index] //index depends on what month I need.
У меня здесь сбой для некоторых устройств, не для каждого устройства. Я не знаю почему.
По умолчанию для календарей не задана локаль. Если вы хотите получить локализованный ответ, обязательно сначала установите свойство локали — скорее всего, это Locale.autoupdatingCurrent.
Нет, это неверно, в Calendar.current языковой стандарт установлен для языкового стандарта пользователя.
Чтобы пояснить мой комментарий выше, я говорю о Calendar.current
, но если Календарь создается вручную с помощью init
, то приведенный выше ответ является правильным, что является, кстати, просто прямой копией из документации.
Вы можете попробовать инициализировать свой собственный календарь с определенным типом. Попробуйте это на детской площадке
let indianCalendar = Calendar(identifier: .indian)
indianCalendar.shortMonthSymbols // ["Chaitra", "Vaisakha", "Jyaistha", "Asadha", "Sravana", "Bhadra", "Asvina", "Kartika", "Agrahayana", "Pausa", "Magha", "Phalguna"]
var gregorianCalendar = Calendar(identifier: .gregorian)
gregorianCalendar.locale = Locale(identifier: "en")
gregorianCalendar.shortMonthSymbols // ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
Символы месяца зависят как от идентификатора календаря, так и от языкового стандарта. Таким образом, вы сможете получить желаемый результат. Однако я не мог получить пустой список. Возможно, для текущей локали на вашем устройстве задано какое-то нестандартное значение, из-за чего список оказывается пустым. Это может быть даже ошибка в SDK.
Это не отвечает на вопрос, но может быть полезно для дальнейшего изучения проблемы.
Рассмотрим следующий тестовый код, который создает массив всех возможных календарей, а затем перебирает их, чтобы вывести содержимое shortMonthSymbols
.
let identifiers: [Calendar.Identifier] = [.buddhist,.coptic,.chinese,.islamic,.ethiopicAmeteAlem,.ethiopicAmeteMihret,.gregorian,.hebrew,
.indian,.islamicCivil,.islamicTabular,.islamicUmmAlQura, .japanese, .persian, .republicOfChina, .iso8601]
for identifier in identifiers {
var calendar = Calendar(identifier: identifier)
calendar.locale = .current
print(calendar.identifier)
print(calendar.shortMonthSymbols)
}
shortMonthSymbols
никогда не бывает пустым.shortMonthSymbols
, мы увидим, что количество месяцев варьируется от 12 до 14 для календарей, поэтому предположение о 12 месяцах явно неверно.shortMonthSymbols
все равно будет содержать значения для всех календарей, хотя для некоторых они содержат общую последовательность M01, M02,...Таким образом, либо есть проблема с какой-то очень конкретной локалью (возможно, в сочетании с каким-то календарем), которая будет генерировать пустой список, либо есть какая-то другая проблема с вашим кодом (например, неверный index
), которая вызывает ваш сбой.
Моя локаль верна и установлена. Вопрос в том, что делать с устройствами, где происходит сбой.