Swift编译器在where子句上崩溃

时间:2014-11-10 14:46:40

标签: generics swift crash

周末我开始玩Swift。我正在尝试构建一个类似应用程序的计算器。因此,我想模拟一个表达式树。

整个swift编译器套件/ xcode似乎仍然非常不稳定。我每隔几分钟就会崩溃。 这就是为什么我想知道我的代码是错还是只是编译器是错误的。


这两个协议正在编译

protocol BinaryOperator {
    typealias LeftType
    typealias RightType
    typealias ResultType

    func apply(left: LeftType, right: RightType) -> ResultType
}

protocol UnaryOperator {
    typealias SourceType
    typealias ResultType

    func apply(SourceType) -> ResultType
}

但是添加以下类,编译器在类的第一行崩溃并出现分段错误。我怀疑它是由where子句引起的,因为如果我删除它,编译器不会再崩溃,但由于类型不匹配,它仍然无法编译。

class BinaryExpression<O:BinaryOperator, L:Expression, R:Expression
where L.ResultType==O.LeftType, R.ResultType==O.RightType> : Expression {

    typealias ResultType = O.ResultType

    let op : O
    let lhs : L
    let rhs : R

    init(op o : O, left : L, right: R) {
        op = o
        lhs = left
        rhs = right
    }

    func eval() -> ResultType {
        let left : O.LeftType = lhs.eval()
        let right : O.RightType = rhs.eval()

        return op.apply(left, right: right)
    }
}

1 个答案:

答案 0 :(得分:0)

我找到了解决方案...... 问题是where子句中等于运算符的类型顺序。

比较(崩溃)

class BinaryExpression
<O:BinaryOperator, L:Expression, R:Expression 
where L.ResultType==O.LeftType, R.ResultType==O.RightType> {}

用(工作)

class BinaryExpression
<O:BinaryOperator, L:Expression, R:Expression 
where O.LeftType==L.ResultType, O.RightType==R.ResultType> {}