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

No candidates produce the expected result

我看过这个 ,但由于我是 Swift 的新手,并且正在遵循应该适用于斯坦福 CS193 课程的代码,所以我有点困惑。

这是一个涉及构建计算器的练习。在模型中我有这些功能:

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 的函数 "return evaluate" 旁边,我得到了 "no candidates for evaluate produce the expected contextual result type...",在控制器中的函数 operate/Enter 旁边,我得到"initializer for conditional type must have optional type..." 在 "let result" 行旁边。

我如何纠正这些错误以及导致它们的原因(因为代码在给定的演示文稿中有效)?

要纠正您的错误,您必须为您的函数指定 return 个值。

这是因为任何函数声明的工作方式都是设置参数(例如,对于 pushOperand,参数是 'operand' 并且它是 Double 类型),然后您还必须指定函数输出的内容结尾(例如,对于 evaluate(),它 return 是 Double 类型的值?可选 Double)。指定 return 类型的方式是在初始化方括号(指定参数的地方)后使用语法 '-> YourType'。

现在这很重要,因为当您将变量设置为函数的 return 值时,就像您在行中所做的那样:

if let result = brain.performOperation(operation) {
        displayValue = result
    } else {
        displayValue = 0
    }

函数 performOperation 不知道它可以 return 一个值,因为你没有指定它,因此结果的值总是 N/A 编译器看到的方式它。

现在 if let 错误是另一回事了。因为您没有为函数指定 return 值,所以您也没有指定 return 值可以为 nil(可选)。如果 let 要求变量的值 it is 'letting' 可以是 nil。

要解决此问题,请尝试:

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