gpt4 book ai didi

swift - 无法将类型 '(CalculatorBrain) -> (Double) -> Double' 的值转换为预期的参数类型 '(Double) -> Double'

转载 作者:搜寻专家 更新时间:2023-11-01 07:05:05 26 4
gpt4 key购买 nike

struct CalculatorBrain {
private var accumulator: Double?
func changeSign(operand: Double) -> Double {
return -operand
}

private enum Operation {
case constant(Double)
case unaryOperation((Double) -> Double)
}
private var operations: Dictionary<String,Operation> = [
"π" : Operation.constant(Double.pi),
"√" : Operation.unaryOperation(sqrt),
"±" : Operation.unaryOperation(changeSign) /* Cannot convert value of type '(CalculatorBrain) -> (Double) -> Double' to expected argument type '(Double) -> Double' */
]
}

我在以“±”开头的行中收到错误消息。我在网上查找了一个解决方案,以下是我在下面找到的类似问题和可能的解决方案。但我不太明白这是怎么回事。谁能帮忙?

Similar Question + solution (1)

Similar Question + Solution (2)

最佳答案

changeSign 函数是CalculatorBrain 的实例函数。

在 Swift 中,任何绑定(bind)到对象实例的函数实际上都具有类型 (Type) -> (Arguments) -> ReturnType,而不仅仅是 (Arguments) -> ReturnType

如果您正在编写类似 instance.doStuff(arguments) 的代码,后台实际发生的是部分应用程序 Type.doStuff(instance)(arguments)Type.doStuff(instance) 返回您的实例函数,然后您可以使用其正常参数调用该函数。

当你直接在结构中创建操作字典而不是在它的函数或初始化器中时,Swift 只能访问你类型的静态成员,而不是 changeSign 被绑定(bind)到一个实例CalculatorBrain,您将获得未绑定(bind)的 CalculatorBrain.changeSign 方法。

这就是为什么您的函数显示为 (CalculatorBrain) -> (Double) -> Double 而不仅仅是 (Double) -> Double

要解决此问题,请将方法设为静态,这样它会删除带有 CalculatorBrain 实例的部分应用程序,将函数声明为全局函数或在 CalculatorBrain< 的初始化程序中定义操作(尽管在使用最后一种方法完成实例化之前,您可能无法访问实例成员)。

关于swift - 无法将类型 '(CalculatorBrain) -> (Double) -> Double' 的值转换为预期的参数类型 '(Double) -> Double',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48554861/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com