Ios 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

我试图在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) }
}
协议日历单元{
别名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)无论如何都要感谢你。