周末我开始玩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)
}
}
答案 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> {}