Можно ли расширить Calendar.Identifier для создания собственного календаря? - PullRequest
0 голосов
/ 25 сентября 2018

Я хотел бы создать быструю реализацию календаря DDate (Discordian Date - Hail Eris!), И мне интересно, есть ли способ расширить перечисление Calendar.Identifer, чтобы включить новый календарь?

Я могу расширить NSCalendar.Identifier с помощью следующего кода, но, кажется, нет способа сделать то же самое с Calendar.Identifier:

extension NSCalendar.Identifier {
  static let discordian = NSCalendar.Identifier(rawValue: "Discordian")
}

NSCalendar соединяется с Календарем, но когдаЯ пытаюсь создать новый объект Calendar, используя метод init Calendar(identifier: Calendar.Identifier), новый идентификатор не отображается в списке идентификаторов.Есть ли способ сделать это?

Ответы [ 3 ]

0 голосов
/ 25 сентября 2018

Calendar.Identifier - это enum, а NSCalendar.Identifier - это структура.enum наблюдения становятся неизменными после объявления enum, поэтому вы не можете добавлять новые случаи в Calendar.Identifier и, следовательно, не можете достичь своей цели.

Встроенные идентификаторы NSCalendar.Identifier соединены сперечисление Calendar.Identifier, но все, что вы добавляете из Swift как расширение к NSCalendar, не может быть соединено с Calendar.

0 голосов
/ 25 сентября 2018

Тип Calendar в Swift поддерживается NSCalendar, что составляет Бесплатный телефонный мост в / из CFCalendar.

Идокументация CFCalendar четко гласит:

В настоящее время нет API для определения ваших собственных календарей.

Swift Calendar также не предоставляет такие API.


Даже если у Calendar были такие API, ваш пользовательский календарь не мог бы быть доступен, просто предоставляя его идентификаторы.

Вам необходимо реализовать множество функций Calendar, настроенных для нового идентификаторасвои собственные и привязать реализации к идентификатору.

Опять же, таких API нет ни в Calendar, NSCalendar, ни CFCalendar.

Так что, вы не можете делатьчто.

0 голосов
/ 25 сентября 2018

Расширения могут быть определены для структур, классов.Перечисления могут быть расширены также с большей функциональностью, но не с новыми случаями.

Идентификатор NSCalendar - это структура, определяемая как:

public struct Identifier : Hashable, Equatable, RawRepresentable {
    public init(_ rawValue: String)
    public init(rawValue: String)
}

Принимая во внимание, что Идентификатор календаря является перечислением, и именно поэтомуон не может быть расширен:

public enum Identifier {
    case gregorian
    case buddhist
    case chinese
    case coptic
    case ethiopicAmeteMihret
    case ethiopicAmeteAlem
    case hebrew
    case iso8601
    case indian
    case islamic
    case islamicCivil
    case japanese
    case persian
    case republicOfChina

    @available(OSX 10.10, iOS 8.0, *)
    case islamicTabular

    @available(OSX 10.10, iOS 8.0, *)
    case islamicUmmAlQura
}

И невозможно, чтобы определенное перечисление расширялось и наследовало случаи другого перечисления.

...