没有候选人产生预期的结果

时间:2016-04-18 14:06:11

标签: swift cs193p

我已经看过这个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;线。

如何纠正这些错误及其导致的错误(因为代码在给出的演示文稿中有效)?

1 个答案:

答案 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
    }
}