我正在跟随斯坦福iOS课程,我有一个问题,我认为这与最近的更新有关。以下是代码部分:
func evaluate(ops: [Op]) -> (result: Double?,remainingOps: [Op]) {
let op = ops.removeLast() //*I thought ops was immutable?
}
在视频中,教师会收到一条错误消息,指出您无法执行此操作,因为操作是不可变的。这是完全合理的,但是当我尝试输入时,我没有收到错误。这是什么意思?这是最近Swift更新中的一个变化,传递给方法的结构是可变的吗?有任何想法吗?在视频中,教师通过创建一个实例变量来解决问题,该变量是操作的副本,但我不再得到错误,并且想要理解为什么会这样。
编辑在操场上输入这个时我仍然会收到错误但我没有在我的Swift文件中。这里参考的是整个文件到目前为止。有任何想法吗?我只是想了解这里发生了什么:
import Foundation
class CalculatorBrain {
private enum Op {
case Operand(Double)
case UnaryOperation(String,Double -> Double)
case BinaryOperation(String, (Double,Double) -> Double)
}
private var opStack = [Op]()
private var knownOps = [String:Op]()
init() {
knownOps["×"] = Op.BinaryOperation("×",*)
knownOps["÷"] = Op.BinaryOperation("÷") { $1 / $0 }
knownOps["+"] = Op.BinaryOperation("+",+)
knownOps["−"] = Op.BinaryOperation("−") { $1 - $0 }
knownOps["^"] = Op.BinaryOperation("^") { pow($1,$0) }
knownOps["√"] = Op.UnaryOperation("√",sqrt)
knownOps["sin"] = Op.UnaryOperation("sin") { sin($0) }
knownOps["cos"] = Op.UnaryOperation("cos") { cos($0) }
knownOps["tan"] = Op.UnaryOperation("tan") { tan($0) }
}
func evaluate(ops: [Op]) -> (result: Double?,remainingOps: [Op]) {
if !ops.isEmpty {
let op = ops.removeLast()//*Error should appear here but does not
}
return (nil,ops)
}
func evaluate() -> Double? {
}
func pushOperand(operand: Double) {
opStack.append(Op.Operand(operand))
}
func performOperation(symbol: String) {
if let operation = knownOps[symbol] {
opStack.append(operation)
}
}
}
答案 0 :(得分:1)
我刚检查过它是否隐式地复制了数组。不,不是的。我想你的xCode是错误的。请重新启动xCode,然后重试。转到实用程序栏,将光标移动到代码中的ops数组上。作为一种类型你观察到什么? "error type"
还是其他什么?您也可以按opt
进行检查,然后点击变量。