2015-02-07 62 views
1

我试图在Swift中大量使用协议来创建日期和日历实现,但它开始在每种方法中抛出分段错误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) } 
} 

怀疑是因为两个协议bu的递归不知道如何以另一种方式实现本节。任何帮助表示赞赏,谢谢提前

编辑

也可以使用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> { 
} 

在我可以插入(内阳历朱利安)任一日历,将满足本协议的例子的需要,但它并不能保证它是相同的日历。有没有办法强制执行此限制,最好不必在typealias中重复日历的名称?

+0

我最好的选择是,因为递归的编译器崩溃。要么他们不支持这个,或者它是编译器中的错误。 – sikhapol 2015-02-07 18:29:03

+0

为什么在CalendarUnit上需要C:Calendar?你能解释一下更多什么“第二”和“C”在您的实施意味着什么? – 2015-02-07 18:29:06

+0

我更新了这个问题,是为了能够创建一个日期结构,它可以要求它的日历表示秒数。但为了使它更加模块化,每种类型都会有自己的初始化程序,逻辑等,日历将成为这些组件类型的持有者。 – 2015-02-07 18:37:36

回答

2

首先: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 
+0

它工作完美,非常感谢。我希望Apple很快纠正许多编译器错误,但不知道它是我还是编译器失败。 – 2015-02-07 19:55:46

+0

是否有一种方法可以限制CalendarUnit中的init中的T与拥有CalendarUnit的Calendar相同? – 2015-02-08 06:56:30

+0

只是为了澄清:你可以添加一个例子,当他们没有什么不同吗? – 2015-02-08 07:04:23