Почему Calendar.current.shortMonthSymbols возвращает пустой список?

Почему, как и в приведенном ниже вопросе, код возвращает пустой список массивов?

let symbols = Calendar.current.shortMonthSymbols //[]

Я предполагал, что в массиве всегда 12 элементов, поэтому я просто обращаюсь к нему:

let selected = symbols[index] //index depends on what month I need.

У меня здесь сбой для некоторых устройств, не для каждого устройства. Я не знаю почему.

Моя локаль верна и установлена. Вопрос в том, что делать с устройствами, где происходит сбой.

Bartłomiej Semańczyk 05.01.2023 09:50
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
55
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

По умолчанию для календарей не задана локаль. Если вы хотите получить локализованный ответ, обязательно сначала установите свойство локали — скорее всего, это Locale.autoupdatingCurrent.

Нет, это неверно, в Calendar.current языковой стандарт установлен для языкового стандарта пользователя.

Joakim Danielson 05.01.2023 09:45

Чтобы пояснить мой комментарий выше, я говорю о Calendar.current, но если Календарь создается вручную с помощью init, то приведенный выше ответ является правильным, что является, кстати, просто прямой копией из документации.

Joakim Danielson 05.01.2023 13:54
Ответ принят как подходящий

Вы можете попробовать инициализировать свой собственный календарь с определенным типом. Попробуйте это на детской площадке

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), которая вызывает ваш сбой.

Другие вопросы по теме