没有候选人产生预期的结果
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
}
}
我看过这个
这是一个涉及构建计算器的练习。在模型中我有这些功能:
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
}
}