是否可以扩展 Calendar.Identifier 来创建自定义日历?

Is it possible to extend Calendar.Identifier to create a custom calendar?

我想创建一个 swift 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 对象时,新标识符没有出现在标识符列表中。有办法吗?

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

NSCalendar 的标识符是一个结构,定义为:

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

而 Calendar 的标识符是一个枚举,这就是它不能扩展的原因:

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
}

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

Calendar.Identifier 是一个 enum,而 NSCalendar.Identifier 是一个结构。 enum 个案例在 enum 声明后是不可变的,因此您无法向 Calendar.Identifier 添加任何新案例,因此无法实现您的目标。

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

Swift 中的 Calendar 类型由 NSCalendar 支持,即 Toll-Free Bridged to/from CFCalendar

CFCalendar 的文档清楚地写着:

There is currently no API for defining your own calendars.

Swift Calendar 也不提供此类 API。


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

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

同样,在 CalendarNSCalendarCFCalendar 中都没有这样的 API。

所以,不行,你不能那样做。