我试图在Swift中大量使用协议来创建日期和日历实现,但它开始在每种方法中抛出分段错误11。我目前的一个是这样的:swift中的协议引用是抛出分段错误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) }
}
怀疑是因为两个协议bu的递归不知道如何以另一种方式实现本节。任何帮助表示赞赏,谢谢提前
编辑
也可以使用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中重复日历的名称?
我最好的选择是,因为递归的编译器崩溃。要么他们不支持这个,或者它是编译器中的错误。 – sikhapol 2015-02-07 18:29:03
为什么在CalendarUnit上需要C:Calendar?你能解释一下更多什么“第二”和“C”在您的实施意味着什么? – 2015-02-07 18:29:06
我更新了这个问题,是为了能够创建一个日期结构,它可以要求它的日历表示秒数。但为了使它更加模块化,每种类型都会有自己的初始化程序,逻辑等,日历将成为这些组件类型的持有者。 – 2015-02-07 18:37:36