swift 中的协议引用引发分段错误 11
Protocol reference in swift is throwing segmentation fault 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) }
}
怀疑是因为两种协议的递归,但不确定如何以另一种方式实现此部分。感谢任何帮助,提前致谢
编辑
也可以在 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> {
}
在示例中,我可以插入任何日历(格里高利历中的儒略历)并且将满足协议需要,但它不保证它是相同的日历。有没有办法强制执行此限制,最好不必在类型别名中重复日历名称?
首先: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
我正在尝试在 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) }
}
怀疑是因为两种协议的递归,但不确定如何以另一种方式实现此部分。感谢任何帮助,提前致谢
编辑
也可以在 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> {
}
在示例中,我可以插入任何日历(格里高利历中的儒略历)并且将满足协议需要,但它不保证它是相同的日历。有没有办法强制执行此限制,最好不必在类型别名中重复日历名称?
首先: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