是否可以扩展 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
为您自己的新标识符定制的功能,并将实现绑定到标识符。
同样,在 Calendar
、NSCalendar
和 CFCalendar
中都没有这样的 API。
所以,不行,你不能那样做。
我想创建一个 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
为您自己的新标识符定制的功能,并将实现绑定到标识符。
同样,在 Calendar
、NSCalendar
和 CFCalendar
中都没有这样的 API。
所以,不行,你不能那样做。