【发布时间】:2015-02-07 18:10:01
【问题描述】:
我正在尝试在 Swift 中创建一个 Date 和 Calendar 实现,大量使用协议,但它开始在每种方法中抛出分段错误 11。我现在是这样的:
protocol CalendarUnit {
typealias C: Calendar
init(_ date: Date<C>)
}
protocol Calendar {
typealias Second: CalendarUnit
}
struct GregorianCalendar: Calendar {
struct Second: CalendarUnit {
}
}
struct Date<C: Calendar> {
let timestamp: Int
var second: C.Second { return C.Second(self) }
}
怀疑是因为两个协议的递归但不确定如何以另一种方式实现这一部分。任何帮助表示赞赏,在此先感谢
编辑
还可以在 calendarunit 的初始化器和它所属的日历之间使用类型限制。
protocol CalendarUnit {
init<C>(date: Date<C>)
}
protocol Calendar {
typealias Year: CalendarUnit
}
struct GregorianCalendar: Calendar {
struct Year: CalendarUnit {
init<C>(date: Date<C>) {
}
}
}
struct JulianCalendar: Calendar {
struct Year: CalendarUnit {
init<GregorianCalendar>(date: Date<GregorianCalendar>) {
}
}
}
struct Date<C: Calendar> {
}
在示例中,我可以插入任何日历(公历中的朱利安)并且将满足协议需求,但它不能保证它是相同的日历。有没有办法强制执行此限制,最好不必在 typealias 中重复日历的名称?。
【问题讨论】:
-
我最好的选择是编译器由于递归而崩溃。要么他们还不支持这个,要么是编译器中的一个错误。
-
为什么需要 C : CalendarUnit 上的日历?你能多解释一下“Second”和“C”在你的实现中是什么意思吗?
-
我更新了这个问题,是为了能够创建一个日期结构,它可以询问它的日历它代表的秒数。但为了使其更加模块化,每种类型都有自己的初始化程序、逻辑等,而日历将是这些组件类型的持有者。
标签: ios xcode date swift calendar