我已经看过这个answer了,但由于我是Swift的新手并且正在遵循斯坦福CS193课程的代码,我有点困惑。< / p>
这是一项涉及构建计算器的练习。在模型中我有这些功能:
private func evaluate() -> Double? {
let (result, remainder) = evaluate(opStack)
return result
}
func pushOperand(operand: Double) {
opStack.append(Op.Operand(operand))
return evaluate()
}
func performOperation(symbol: String) {
if let operation = knownOps[symbol] {
opStack.append(operation)
return evaluate()
}
}
在控制器中,我有以下功能:
@IBAction func operate(sender: UIButton) {
if userIsInTheMiddleOfTypingANumber {
enter()
}
if let operation = sender.currentTitle {
if let result = brain.performOperation(operation) {
displayValue = result
} else {
displayValue = 0
}
}
}
@IBAction func enter() {
userIsInTheMiddleOfTypingANumber = false
if let result = brain.pushOperand(displayValue) {
displayValue = result
} else {
displayValue = 0
}
}
在模型中的函数pushOperand / performOperation旁边,它表示&#34;返回evaluate&#34;,我得到&#34;没有评估的候选者产生预期的上下文结果类型......&#34;并且在函数操作/输入控制器旁边,我得到条件类型的初始化程序必须具有可选类型...&#34;在&#34;旁边结果&#34;线。
如何纠正这些错误及其导致的错误(因为代码在给出的演示文稿中有效)?
答案 0 :(得分:3)
要纠正错误,您必须具有指定函数的返回值。
这是因为任何函数声明的工作方式是你设置参数(例如对于pushOperand参数是'operand'而且它是Double类型)然后你还必须指定函数输出到底是什么(例如对于evaluate(),它返回Double类型的值?可选Double )。指定返回类型的方式是语法' - &gt;在init括号之后的YourType(指定参数的位置。
现在这很重要,因为当你将变量设置为函数的返回值时,就像你在行中一样:
if let result = brain.performOperation(operation) {
displayValue = result
} else {
displayValue = 0
}
函数performOperation不知道它可以返回一个值,因为你没有指定它,因此result的值总是与编译器看到它的方式不同。
现在if let错误是另一个错误。因为您没有为函数指定返回值,所以您还没有指定返回值可能为nil(是可选的)。如果let要求变量的值为'letting'可能为零。
要解决此问题,请尝试:
func pushOperand(operand: Double) -> Double? {
opStack.append(Op.Operand(operand))
return evaluate()
}
func performOperation(symbol: String) -> Double? {
if let operation = knownOps[symbol] {
opStack.append(operation)
return evaluate()
} else {
return nil
}
}