2014-11-10 3 views
0

В выходные я начал играть со Свифт. Я пытаюсь построить калькулятор, как приложение. Поэтому я хочу смоделировать дерево выражений.Быстрое компилятор компилятора, где статья

Весь пакет быстрого компилятора/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) 
    } 
} 

ответ

0

Я нашел решение ... Проблема заключалась в порядок Типов у оператора равенства в ИНЕКЕ.

Сравнить (сбой)

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> {}