Ios swift中的协议参考是错误11
我试图在Swift中大量使用协议来创建日期和日历实现,但它开始在每种方法中抛出分段错误11。我现在的一个是:Ios swift中的协议参考是错误11,ios,xcode,date,swift,calendar,Ios,Xcode,Date,Swift,Calendar,我试图在Swift中大量使用协议来创建日期和日历实现,但它开始在每种方法中抛出分段错误11。我现在的一个是: protocol CalendarUnit { typealias C: Calendar init(_ date: Date<C>) } protocol Calendar { typealias Second: CalendarUnit } struct GregorianCalendar: Calendar { struct Second: Cal
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) }
}
协议日历单元{
别名C:日历
初始(uu日期:日期)
}
协议日历{
typealias秒:日历单位
}
结构GregorianCalendar:日历{
第二个结构:日历单元{
}
}
结构日期{
让时间戳: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> {
}
协议日历单元{
初始(日期:日期)
}
协议日历{
类型别名年份:日历单位
}
结构GregorianCalendar:日历{
结构年份:日历单位{
初始(日期:日期){
}
}
}
JulianCalendar结构:日历{
结构年份:日历单位{
初始(日期:日期){
}
}
}
结构日期{
}
在本例中,我可以插入任何日历(朱利安在公历中),并将满足协议的需要,但不能保证它是相同的日历。是否有办法强制执行此限制,最好不必在typealias中重复日历的名称?首先:不管语法是否正确,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
<代码>导入基础
协议日历单元{
初始(uu日期:日期)
}
协议日历{
typealias秒:日历单位
}
结构GregorianCalendar:日历{
第二个结构:日历单元{
初始(uu日期:日期){
println(“已初始化”)
}
}
}
结构日期{
让时间戳:Int
var second:C.second{return C.second(self)}
}
let test=日期(时间戳:0)
让秒=测试秒
我的最佳选择是编译器因递归而崩溃。要么他们还不支持,要么这是编译器中的一个bug。为什么在CalendarUnit上需要C:Calendar?。你能再解释一下“秒”和“C”在你的实现中意味着什么吗?我更新了这个问题,就是能够创建一个日期结构,它可以询问日历它代表的秒数。但是为了使它更加模块化,每种类型都有自己的初始值设定项、逻辑等,日历将是这些组件类型的持有者。它工作得非常好,非常感谢。我希望苹果能很快纠正许多编译器错误,不知道是我还是编译器出了问题是令人沮丧的。有没有办法限制CalendarUnit内部init中的T与拥有CalendarUnit的日历相同?只是想澄清一下:当它们没有不同时,您可以添加一个示例吗?您现在遇到的是一个有趣的情况:在您的示例中您正在使用
init(date:date)
但想猜一下gregoriacalendar.self
类型是什么?它实际上是朱利安卡伦达类型的!。原因是泛型语法采用类型的任何名称。您将它命名为GregoriaCalendar
,但实际上您可以根据需要将它命名为(我碰巧将它命名为T
)。尝试执行:println(\(GregorianCalendar.self是JulianCalendar.Type)”)
在示例的日历单元内。你会发现这是真的。好的,谢谢你帮我理解。不幸的是,为了能够强制执行类型限制,我必须等待协议递归得到修复。因为类似的事情仍然可能发生:让date=date()gregoriacalendar.Year(date:date)无论如何都要感谢你。