【问题标题】:Is it possible to extend Calendar.Identifier to create a custom calendar?是否可以扩展 Calendar.Identifier 来创建自定义日历?
【发布时间】:2018-09-25 14:33:35
【问题描述】:

我想创建一个 DDate(Discordian Date - Hail Eris!)日历的快速实现,我想知道是否有办法扩展 Calendar.Identifer 枚举以包含一个新日历?

我可以使用以下代码扩展NSCalendar.Identifier,但似乎没有办法对Calendar.Identifier 做同样的事情:

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

NSCalendar 桥接到 Calendar,但是当我尝试使用 Calendar(identifier: Calendar.Identifier) init 方法实例化新的 Calendar 对象时,新标识符不会显示在标识符列表中。有没有办法做到这一点?

【问题讨论】:

    标签: swift calendar nscalendar


    【解决方案1】:

    Swift 中的Calendar 类型由NSCalendar 支持,即Toll-Free Bridged 到/来自CFCalendar

    CFCalendar 的文档清楚地写着:

    目前没有用于定义您自己的日历的 API。

    Swift Calendar 也不提供此类 API。


    即使Calendar 有这样的 API,您的自定义日历也无法仅提供其标识符。

    您需要实现为您自己的新标识符定制的Calendar 的许多功能,并将实现绑定到标识符。

    同样,CalendarNSCalendarCFCalendar 中都没有此类 API。

    所以,没办法,你不能那样做。

    【讨论】:

      【解决方案2】:

      Calendar.Identifier 是一个enum,而NSCalendar.Identifier 是一个结构。一旦声明了enumenum case 就是不可变的,因此您无法向Calendar.Identifier 添加任何新 case,因此无法实现您的目标。

      NSCalendar.Identifier 的内置标识符被桥接到 Calendar.Identifier 枚举,但是无论你从 Swift 添加作为 NSCalendar 的扩展的任何内容都不能桥接到 Calendar

      【讨论】:

        【解决方案3】:

        Extensions 可以在结构、类上定义。枚举也可以扩展为更多功能,但不是新案例。

        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
        }
        

        并且不可能让某个枚举扩展并继承另一个枚举的情况。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-08-27
          • 1970-01-01
          相关资源
          最近更新 更多