我试图在 Swift 中大量使用协议(protocol)来创建日期和日历实现,但它开始在每种方法中抛出段错误 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) }
}
怀疑是因为两种协议(protocol)的递归,但不确定如何以另一种方式实现此部分。感谢任何帮助,提前致谢
编辑
也可以在 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> {
}
在示例中,我可以插入任何日历(格里高利历中的朱利安)并将满足协议(protocol)需要,但它不保证它是相同的日历。有没有办法强制执行此限制,最好不必在类型别名中重复日历的名称?
最佳答案
首先:llvm 抛出段错误始终是编译器中的一个错误,无论您的语法是否正确,您都应该为它做好准备。
关于您的问题:我认为您不需要递归定义。您可以通过这样的实现实现我认为您需要的:
import Foundation
protocol CalendarUnit {
init<T>(_ date: Date<T>)
}
protocol Calendar {
typealias Second: CalendarUnit
}
struct GregorianCalendar: Calendar {
struct Second: CalendarUnit {
init<T>(_ date: Date<T>) {
println("Initialized")
}
}
}
struct Date<C: Calendar> {
let timestamp: Int
var second: C.Second { return C.Second(self) }
}
let test = Date<GregorianCalendar>(timestamp: 0)
let seconds = test.second
关于ios - swift 中的协议(protocol)引用抛出段错误 11,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28385607/