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